解决hessian远程调用连接超时的问题

目前几套系统中主要使用的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();
 }
}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值