<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    于吉吉的技術博客

    建造高性能門戶網

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      65 隨筆 :: 6 文章 :: 149 評論 :: 0 Trackbacks
    目前幾套系統中主要使用的hessian進行遠程調用webservice服務的有hessian的HessianProxyFactory(com.caucho.hessian.client.HessianProxyFactory)和spring的HessianProxyFactoryBean(org.springframework.remoting.caucho.HessianProxyFactoryBean).

    1.HessianProxyFactory
    查看HessianProxyFactory源碼后發現,hessian在創建http請求連接webservice服務并沒有對連接超時進行相關的參數設置,所以當網絡出現問題就會造成整個hessian處理的阻塞,進而阻塞整個線程后續的處理
    以下是HessianProxyFactory對連接處理的源碼

    protected URLConnection openConnection(URL url)
        
    throws IOException
      {
        URLConnection conn 
    = url.openConnection();

        conn.setDoOutput(
    true);

        
    if (_readTimeout > 0) {
          
    try {
        conn.setReadTimeout((
    int) _readTimeout);
          } 
    catch (Throwable e) {
          }
        }

        conn.setRequestProperty(
    "Content-Type""x-application/hessian");

        
    if (_basicAuth != null)
          conn.setRequestProperty(
    "Authorization", _basicAuth);
        
    else if (_user != null && _password != null) {
          _basicAuth 
    = "Basic " + base64(_user + ":" + _password);
          conn.setRequestProperty(
    "Authorization", _basicAuth);
        }

        
    return conn;
      }

    所以我們針對此邏輯繼承并重寫該openConnection方法,在創建http連接的時候通過設置連接超時時間來解決因網絡問題阻塞程序繼續的問題

    public class MyHessianProxyFactory extends HessianProxyFactory {

        
    private int connectTimeOut = 10000;

        
    private int readTimeOut = 10000;

        
    public int getConnectTimeOut() {
            
    return connectTimeOut;
        }

        
    public void setConnectTimeOut(int connectTimeOut) {
            
    this.connectTimeOut = connectTimeOut;
        }

        
    public int getReadTimeOut() {
            
    return readTimeOut;
        }

        
    public void setReadTimeOut(int readTimeOut) {
            
    this.readTimeOut = readTimeOut;
        }

        
    protected URLConnection openConnection(URL url) throws IOException {
            URLConnection conn 
    = url.openConnection();
            conn.setDoOutput(
    true);
            
    if (this.connectTimeOut > 0) {
                conn.setConnectTimeout(
    this.connectTimeOut);
            }
            
    if (this.readTimeOut > 0) {
                conn.setReadTimeout(
    this.readTimeOut);
            }
            conn.setRequestProperty(
    "Content-Type""x-application/hessian");
                
    if (_basicAuth != null)
                      conn.setRequestProperty(
    "Authorization", _basicAuth);
                
    else if (_user != null && _password != null) {
                      _basicAuth 
    = "Basic " + base64(_user + ":" + _password);
                      conn.setRequestProperty(
    "Authorization", _basicAuth);
                }
            
    return conn;
        }
    }

    2.HessianProxyFactoryBean
    查看spring的HessianProxyFactoryBean源碼發現,它在封裝hessian是直接創建一個HessianProxyFactory實例,然后利用該實例完成創建遠程服務

    public class HessianProxyFactoryBean extends HessianClientInterceptor implements FactoryBean {

        
    private Object serviceProxy;


        
    public void afterPropertiesSet() {
            
    super.afterPropertiesSet();
            
    this.serviceProxy = ProxyFactory.getProxy(getServiceInterface(), this);
        }
        

        
    public Object getObject() {
            
    return this.serviceProxy;
        }

        
    public Class getObjectType() {
            
    return getServiceInterface();
        }
        
        
    public boolean isSingleton() {
            
    return true;
        }

    }

    所以對此的解決方法與上面差不多,繼承HessianProxyFactoryBean然后加入相應的連接超時和讀取超時的變量,重寫afterPropertiesSet方法,并且同時完成上面第一步對HessianProxyFactory的改造,這樣就能保證連接遠程webserver服務器時不會因為網絡原因阻塞程序的執行

    public class MyHessianProxyFactoryBean extends HessianProxyFactoryBean {

        
    private MyHessianProxyFactory proxyFactory = new MyHessianProxyFactory();

        
    private int readTimeOut = 10000;

        
    private int connectTimeOut = 10000;

        
    public int getReadTimeOut() {
            
    return readTimeOut;
        }

        
    public void setReadTimeOut(int readTimeOut) {
            
    this.readTimeOut = readTimeOut;
        }

        
    public int getConnectTimeOut() {
            
    return connectTimeOut;
        }

        
    public void setConnectTimeOut(int connectTimeOut) {
            
    this.connectTimeOut = connectTimeOut;
        }

        
    public void afterPropertiesSet() {
            proxyFactory.setReadTimeout(readTimeOut);
            proxyFactory.setConnectTimeOut(connectTimeOut);
            setProxyFactory(proxyFactory);
            
    super.afterPropertiesSet();
        }
    }


    posted on 2010-12-16 14:46 陳于喆 閱讀(12058) 評論(11)  編輯  收藏 所屬分類: web開發javaweb service

    評論

    # re: 解決hessian遠程調用連接超時的問題 2010-12-16 15:25 Xuzhengsong
    我覺得可以這樣重寫openConnection方法
    protected URLConnection openConnection(URL url) throws IOException {

    URLConnection conn = super.openConnection(url);
    if (this.connectTimeOut > 0) {
    conn.setConnectTimeout(this.connectTimeOut);
    }
    retrun conn;
    }  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2010-12-16 15:33 陳于喆
    @Xuzhengsong
    非常感謝,這樣更簡潔  回復  更多評論
      

    # ugg boots womens 2010-12-16 15:47 ugg boots womens
    謝謝 這樣以后方便了許多  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2010-12-28 18:53 mrt_soul
    HessianProxyFactory 有_readTimeout設置項啊!
    只是沒有connectTimeOut  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2011-10-17 13:05 郭蕾
    樓主,在hessian中相關設置的!  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2012-07-23 12:25 Eddy.he
    請問你用的是哪個版本的hessian包?父類HessianProxyFactory 里面的變量_basicAuth 、_user ,子類能引用到嗎?不知道你自己有沒有測試過哦。  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2012-07-23 12:30 Eddy.he
    @郭蕾
    你設置給我看看,怎么設置connectTimeout?麻煩分享一下。  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2012-11-05 17:24 郭蕾
    factory.setReadTimeout  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2012-11-05 17:25 郭蕾
    請看看這個軟件:http://www.oschina.net/news/34462/hetty-1-3-rpc-framework  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題 2012-11-15 15:17 gahd
    你敢把代碼寫完么?帖一部分跟沒帖沒什么區別吧  回復  更多評論
      

    # re: 解決hessian遠程調用連接超時的問題[未登錄] 2016-01-22 11:11 aa
    樓主用的是哪個版本的hessian啊  回復  更多評論
      

    主站蜘蛛池模板: jizz在线免费观看| 日韩精品在线免费观看| 立即播放免费毛片一级| 国产精品综合专区中文字幕免费播放 | 在线观看免费播放av片| 无人影院手机版在线观看免费| 亚洲av无码不卡私人影院| 亚洲黄色在线观看视频| 西西人体大胆免费视频| 免费A级毛片无码A∨中文字幕下载| 四虎影院免费视频| 国产成人亚洲精品青草天美| 亚洲精品无码久久久久APP| 成在人线av无码免费高潮喷水| 久久亚洲精品视频| 久久久久久久岛国免费播放 | igao激情在线视频免费| 国产午夜亚洲精品理论片不卡| 日韩亚洲国产综合高清| 十九岁在线观看免费完整版电影| 亚洲AV无码AV男人的天堂| 国产亚洲福利精品一区二区| 亚洲精品WWW久久久久久| 亚洲熟妇无码一区二区三区 | 中国一级特黄的片子免费| 国产老女人精品免费视频| 亚洲午夜国产精品| 久久久久国产精品免费看| 亚洲免费观看网站| 国产jizzjizz免费视频| 亚洲男同gay片| 亚洲伊人久久综合影院| 免费无码专区毛片高潮喷水| 在线看片无码永久免费aⅴ| 亚洲综合av一区二区三区不卡| 又黄又爽的视频免费看| 理论亚洲区美一区二区三区| 妞干网免费视频在线观看| jizz日本免费| 国产成人精品日本亚洲网址| 国产成人yy免费视频|