Hessian连接超时设置

摘要:
在上一次黑森分析和应用中,在学习了黑森的用法和原理后,我总觉得脑海中留下了一个“结”……那就是超时时间的设置。这种远程调用不可避免地会超时。publicclassMyHessianProxyFactoryBeannextendsHessianProxy FactoryBean{privateMyHessian ProxyFactoryProxyFactory=newMyHessian-ProxyFactory();privateintradTimeOut=10000;privateint connectTimeOut=0000;publicintgetReadTimeOut(){returnreadTimeOut;}publicvoidsetReadTimeOut{this.readTimeOut=readTimeOut;}publicintgetConnectTimeOut(){returnconnectTimeOut;}publicvoidsetConnectTimeOut{this.connectTimeOut=connectTimeOut;}publicvoidafterPropertiesSet(){proxyFactory.setReadTimeout;proxyFactory.set ConnectTimeOut;setProxyFactory;super.afterPropertiesSet();}}---------------------------------------------------------------------拆分行------------------------------------------------------------------------------搜索上述内容,然后不断与Hessian源代码分析进行比较,从未在HessianProxyFactory中找到openConnection方法。然后我想到了版本问题。我使用了hessian-4.0.7,并在版本3中看到了HessianProxyFactory中的openConnection方法。然后我查看了4中的相关代码。在HessianProxy Factory中,我看到了以下代码:protectedHessianConnectionFactorycreateHessianConnection Factory(){StringclassName=System.getProperty;HessianConnectionFactoryfactory=null;try{if(className!

     上一篇Hessian解析及应用(整合Spring)中,学习了Hessian的使用及原理后,总觉得有个“疙瘩”  遗留在心里......那就是超时时间的设置,这样的远程调用,难免会有超时的情况发生。

     今日想起,遂Google之......然后看到了这位仁兄的文章http://www.blogjava.net/dongbule/archive/2010/12/16/340894.html (解决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连接的时候通过设置连接超时时间来解决因网络问题阻塞程序继续的问题

    代码来自 Xuzhengsong

protected URLConnection openConnection(URL url) throws IOException { 

URLConnection conn = super.openConnection(url); 
if (this.connectTimeOut > 0) { 
conn.setConnectTimeout(this.connectTimeOut); 
} 
retrun conn; 
}

    查看spring的HessianProxyFactoryBean源码发现(原码分析见Hessian解析及应用(整合Spring)),它在封装hessian是直接创建一个HessianProxyFactory实例,然后利用该实例完成创建远程服务,所以对此的解决方法与上面差不多,继承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();
    }
}

---------------------------------------------------------------------分割线-----------------------------------------------------------------------------------

     Google了以上内容,然后不断的对照Hessian原码分析,始终没有在HessianProxyFactory中发现openConnection方法,然后就想到了版本问题,本人使用hessian-4.0.7,在版本3的HessianProxyFactory中看到了openConnection方法。

然后看了4中相关的代码,在HessianProxyFactory看到以下代码(至于怎么到createHessianConnectionFactory()方法中的,还是看Hessian解析及应用(整合Spring)吧)

protected HessianConnectionFactory createHessianConnectionFactory()
  {
    String className
      = System.getProperty(HessianConnectionFactory.class.getName());

    HessianConnectionFactory factory = null;
      
    try {
      if (className != null) {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    
    Class<?> cl = Class.forName(className, false, loader);

    factory = (HessianConnectionFactory) cl.newInstance();

    return factory;
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }

    return new HessianURLConnectionFactory();
  }

进入HessianURLConnectionFactory类,看到里面的open方法

 /**
   * Opens a new or recycled connection to the HTTP server.
   */
  public HessianConnection open(URL url)
    throws IOException
  {
    if (log.isLoggable(Level.FINER))
      log.finer(this + " open(" + url + ")");

    URLConnection conn = url.openConnection();

    // HttpURLConnection httpConn = (HttpURLConnection) conn;
    // httpConn.setRequestMethod("POST");
    // conn.setDoInput(true);

    long connectTimeout = _proxyFactory.getConnectTimeout();

    if (connectTimeout >= 0)
      conn.setConnectTimeout((int) connectTimeout);

    conn.setDoOutput(true);

    long readTimeout = _proxyFactory.getReadTimeout();

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

可见hessian4对超时时间已经做了改进,所以使用时只需要通过Spring设置超时时间即可。

超时时间设置setConnectTimeout方法在HessianProxyFactory中,Spring的HessianClientInterceptor是它的子类并包含一个HessianProxyFactory实例,所以可以在HessianClientInterceptor中提供一个setConnectionTimeout方法:

public void setConnectTimeout(long timeout) {
        this.proxyFactory.setConnectTimeout(timeout);
    }

     并在Spring配置设置时间即可。

     

免责声明:文章转载自《Hessian连接超时设置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇elasticsearch lucence查询语法(较全)Comet 反Ajax: jQuery与PHP实现Ajax长轮询下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hessian协议原理

Hessian 原理分析 一. 远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio 、 ni...

第十三节、SURF特征提取算法

上一节我们已经介绍了SIFT算法,SIFT算法对旋转、尺度缩放、亮度变化等保持不变性,对视角变换、仿射变化、噪声也保持一定程度的稳定性,是一种非常优秀的局部特征描述算法。但是其实时性相对不高。 SURF(Speeded Up Robust Features)算法改进了特征了提取和描述方式,用一种更为高效的方式完成特征点的提取和描述。 一 使用快速Hessi...

dubbo协议参考手册(转)

原文链接:http://wely.iteye.com/blog/2331332 协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告(+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服...

Spring整合Hessian访问远程服务

声明:该文章转载自Spring整合Hessian访问远程服务,本人搬过来只是为了记录下学习Hessian的过程,忘此博主理解,在此感谢,等本人有能力了再学一些原创的东东,本人实践了下,hessianServer项目不是web project,由于较菜,花了一个下午才把java project转换成为web project。 项目下载: hessianSer...

Hessian反序列化RCE漏洞

Hessian反序列化RCE漏洞 靶机搭建 安装java 安装tomcat 部署Hessianhttps://raw.githubusercontent.com/21superman/Hessian-Deserialize-RCE/master/HessianTest.war 访问:http://192.168.31.36:8080//HessianTe...

第15章-使用远程服务

1 Spring远程调用概览 图15.1 第三方客户端能够远程调用Spittr的服务,从而实现与Spittr应用交互 其他应用与Spittr之间的会话开始于客户端应用的一个远程过程调用(remote procedure call,RPC)。从表面上看,RPC类似于调用一个本地对象的一个方法。这两者都是同步操作,会阻塞调用代码的执行,直到被调用的过程执行完...