`

解决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();
    }
}
   http://www.blogjava.net/dongbule/archive/2010/12/16/340894.html
分享到:
评论

相关推荐

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    Hessian由Caucho Technology公司开发,旨在解决XML-RPC在数据传输中的低效问题。本教程将通过一个入门Demo来介绍如何使用Hessian进行远程接口调用。 首先,让我们理解Hessian的优势。与XML-RPC相比,Hessian使用二...

    rpc远程调用使用说明&源码

    3. **服务消费者(ServiceConsumer)**:从服务注册中心获取服务接口的引用,实现远程调用。 4. **代理类(Proxy Class)**:动态生成的类,实现了服务接口,内部调用RPC框架的调用逻辑。 5. **调用处理(Invocation...

    使用hessian进行服务器-客户端通讯

    Hessian是一种二进制Web服务协议,它提供了一种高效的RPC(远程过程调用)机制,使得服务器和客户端之间能够进行快速、简单的通信。...通过理解和实践这个案例,你将能够熟练地在Java项目中使用Hessian进行远程调用。

    Hessian案列代码

    - 虽然Hessian提供了高效的通信方式,但也要注意安全性问题,如防止未授权的远程调用。 - 对于敏感数据,可以使用HTTPS进行加密传输,以保护数据的安全。 - 另外,可以通过缓存代理对象和批量处理请求等方式...

    rpc远程调用

    总结,RPC远程调用是分布式系统中服务间通信的关键技术,它简化了跨网络的调用复杂性,让开发者可以像调用本地方法一样调用远程服务。各种RPC框架如gRPC、Dubbo等提供了不同的实现方式和优化策略,以满足不同场景下...

    C#中Hessian的使用例子

    在.NET开发环境中,C#是一种常用的编程语言,而Hessian是一种二进制的远程方法调用(Remote Method ...通过理解Hessian协议的原理和使用方式,以及如何在C#中集成和配置,你可以创建出性能优异的远程调用解决方案。

    rpc 远程调用

    为了实现这一点,客户端需要一个代理对象,这个代理对象负责将本地的接口调用转化为远程调用。例如,Spring框架的`JDK Proxy`或`CGLIB`可以用来创建动态代理,使得客户端可以透明地调用远程服务。 2. **序列化与反...

    用hessian c#桌面程序调用J2EE后台服务

    在J2EE后台服务端,你需要创建一个可被远程调用的服务接口。这个接口通常是一个Java Servlet,通过实现Servlet或HttpServlet类,然后暴露一些业务方法。例如: ```java public class HessianService extends ...

    Hessian异步请求访问包

    在IT行业中,尤其是在移动开发领域,Hessian是一种广泛使用的二进制协议,它允许远程对象调用(Remote Object Invocation)。本知识点主要关注的是在Android平台上,如何使用Hessian进行异步请求访问,以便提高应用...

    Hessian和Spring集成示例

    此外,还可以通过配置优化Hessian连接的超时时间、线程池大小等参数,以适应不同的性能需求。 6. **测试与监控**:完成集成后,进行测试以确保服务正常工作。同时,可以使用工具监控Hessian服务的性能和稳定性,...

    java 使用hessian进行两台服务器资源之间同步实例

    要实现两台服务器间的资源同步,首先你需要在服务提供者(Server A)上创建一个可被远程调用的服务接口和其实现。例如,你可以定义一个名为`ResourceService`的接口,其中包含了一些用于获取或更新资源的方法: ```...

    Hessian(Spring集成的)的应用与研究

    Hessian支持Java、C++、Python等多种语言,便于跨平台的远程调用。 二、Spring集成Hessian Spring通过其AOP(面向切面编程)和IoC(控制反转)理念,为Hessian提供了便捷的整合方式。在Spring中,我们可以定义一个...

    使用hessian进行web与android端的通讯

    4. **异常处理与安全性**:在使用Hessian时,需要注意异常处理,比如网络中断、超时等问题。此外,为了确保通信安全,可以考虑在Hessian服务上启用HTTPS,或者对传输的数据进行加密。 5. **性能优化**:尽管Hessian...

    【Android】使用Hessian与Java服务端通讯

    在这种情况下,Hessian是一种高效的二进制协议,可以用于创建轻量级的远程过程调用(RPC)服务。本文将详细介绍如何在Android客户端中使用Hessian与Java服务端进行通讯。 **一、Hessian概述** Hessian是由Caucho...

    JAVA开发工程师精选面试题

    1. Dubbo服务调用超时问题解决方案:可以在消费者端与提供者端设置超时时限来解决,同时需要设计好业务代码来减少调用时长,设置准确的RPC调用的超时时间。 2. Dubbo支持的序列化方式:默认使用Hessian序列化,还有...

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    标题中的“nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用”意味着在Node.js环境中,开发者成功地实现了对Dubbo服务的RPC(远程过程调用)访问,利用了Dubbo协议的特性。Dubbo是阿里巴巴开源的一个高性能、轻量...

    使用httpInvoker提供远程服务

    3. **调用服务**:一旦代理配置完成,就可以像调用本地方法一样调用远程服务了。Java的序列化机制会自动处理参数和返回值的序列化和反序列化。 HttpInvoker的优势在于其对复杂对象的支持,特别是当参数或返回值无法...

    Dubbo服务框架面试题及答案.pdf

    服务提供者端的超时时间更接近服务的实际特性,而消费者端的设置优先级更高,可以更灵活地控制调用超时。 Dubbo支持多种注册中心,如Multicast、Zookeeper、Redis和Simple,用于服务的注册与发现。注册中心的选择取...

    Java Dubbo面试及答案

    3. WebService 协议:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用。 4. HTTP 协议:基于 Http 表单提交的...

    Dubbo简介.docx

    - 缺点:受限于缓存系统的特性,可能不适用于所有远程调用场景。 **Dubbo 超时时间设置** Dubbo 允许在服务提供者端和服务消费者端分别设置超时时间。服务端设置可更好地根据服务特性优化,而消费者端设置具有更高...

Global site tag (gtag.js) - Google Analytics