请下载附件查看·····
Spring中集成Hessian的问题:
主要解决的两个问题
第一个请求超时的问题,
第二个在调用Hessian接口异常捕获不到异常的问题
Spring版本:3.2.11
Hessian版本:3.1.3
Hessian在Spring中的使用
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1043" type="#_x0000_t75" style='width:415.5pt;height:58.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
HessianProxyFactoryBean是Spring的代理Hessian工厂类,为构建HessianProxyFactory提供对应的配置参数,通过继承链来实现参数的的注入。
在HessianProxyFactory中有具体的参数可自行选择配置
在UrlBasedRemoteAccessor 注入 serviceUrl
在RemoteAccessor注入serviceInterface
在HessianClientInterceptor 注入其他字段设置,如请求超时,读取内容超时,等
private String _user;//用户名
private String _password; //密码
private String _basicAuth;//此致默认为空
private boolean _isOverloadEnabled = false; //是否是重载方法(不推荐)
private boolean _isHessian2Reply = false; //是否使用Hessian2.0协议
private boolean _isHessian2Request = false;//是否使用Hessian2.0协议
private boolean _isChunkedPost = false;// 设置Chunked编码方式发送请求
private boolean _isDebug = false;//是否调试
private long _readTimeout = -1;//读取内容超时设置
那么spring是如何创建HessianProxyFactory对象的呢?
在HessianClientInterceptor类中
<!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1042" type="#_x0000_t75" style='width:415.5pt; height:60pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]><v:shape id="图片_x0020_3" o:spid="_x0000_i1041" type="#_x0000_t75" style='width:415.5pt; height:290.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
它是直接创建一个HessianProxyFactory实例,set注入的属性值然后利用该实例完成创建远程服务
主要调用方法是创建一个HessianProxy:
<!--[if gte vml 1]><v:shape id="图片_x0020_4" o:spid="_x0000_i1040" type="#_x0000_t75" style='width:415.5pt; height:236.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image007.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
HessianProxy代码片段
<!--[if gte vml 1]><v:shape id="图片_x0020_5" o:spid="_x0000_i1039" type="#_x0000_t75" style='width:414.75pt; height:228.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image009.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]><v:shape id="图片_x0020_6" o:spid="_x0000_i1038" type="#_x0000_t75" style='width:415.5pt; height:343.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image011.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
<!--[if gte vml 1]><v:shape id="图片_x0020_8" o:spid="_x0000_i1037" type="#_x0000_t75" style='width:415.5pt; height:261pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image013.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
此处的Factory是HessianProxyFactory _factory;
<!--[if gte vml 1]><v:shape id="图片_x0020_9" o:spid="_x0000_i1036" type="#_x0000_t75" style='width:414.75pt; height:256.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image015.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
HessianProxyFactory类中的方法
<!--[if gte vml 1]><v:shape id="图片_x0020_10" o:spid="_x0000_i1035" type="#_x0000_t75" style='width:415.5pt; height:292.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image017.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
请求响应的主要调用方法就是以上代码片段
第一个请求超时的问题的解决方案,
<!--[if !supportLists]-->1. <!--[endif]-->通过查看HessianProxyFactory中openConnection(URL url)的方法可以看到在URLConnection实例对象中只有readTimeout(注意readTimeout中out是小写)属性,并且默认值是-1,也就是无限制。
<!--[if !supportLists]-->2. <!--[endif]-->首先我们继承HessianProxyFactory并覆openConnection(URL url)方法写一个如图
<!--[if gte vml 1]><v:shape id="图片_x0020_12" o:spid="_x0000_i1034" type="#_x0000_t75" style='width:415.5pt;height:431.25pt; visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image019.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
3.继承Spring的Hessian代理Bean – HessianProxyFactoryBean如图
<!--[if gte vml 1]><v:shape id="图片_x0020_13" o:spid="_x0000_i1033" type="#_x0000_t75" style='width:415.5pt; height:351pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image021.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
然后在Spring中调用的配置是:
<!--[if gte vml 1]><v:shape id="图片_x0020_14" o:spid="_x0000_i1032" type="#_x0000_t75" style='width:415.5pt; height:88.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image023.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
参数说明:
此处列出主要参数,其中我们主要使用的参数是,其他参数默认值即可
serviceUrl – 请求地址
serviceInterface - 接口类
overloadEnabled - 是否支持重写(推荐否)
readTimeout - 根据需求自行设定
connectTimeOut - 根据需求自行设定
其中user,password,baseicAuthor是在请求协议中设置头信息,服务端会校验这个头信息(单在源码中没有发现,可能需要自行实现)例如像:conn.setRequestProperty("Content-Type", "x-application/hessian");
第二个在调用Hessian接口异常捕获不到异常的问题
异常信息例如:
<!--[if gte vml 1]><v:shape id="图片_x0020_15" o:spid="_x0000_i1031" type="#_x0000_t75" style='width:415.5pt; height:140.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image025.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
在服务端如果服务宕掉,或者接口版本不一致,或者在客户端抛出的异常,都可以被捕获到并且调用上层,并最终被catch,例如抛出的是一个HessianRuntimeException异常在
<!--[if gte vml 1]><v:shape id="图片_x0020_18" o:spid="_x0000_i1030" type="#_x0000_t75" style='width:415.5pt; height:267.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image027.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
Hessian的在远程调用的时候也是采用JDK动态代理方法,可以通过
public class HessianProxy implements InvocationHandler源码中看出
在异常体系中Throable是Exception和Error的子类,RunTimeException是Exception的子类。也就是说异常链中异常只能捕获异常本身和以及继承了该异常的子类抛出的异常,如果捕获不了就抛给上层处理。
在看源码过程中在执行方法中直接抛出的是Throwable,对我们来说调用Hessian服务端接口有不可预知的异常或者错误,所以我们直接使用Throwable来捕获异常和错误。
例如:
<!--[if gte vml 1]><v:shape id="图片_x0020_19" o:spid="_x0000_i1029" type="#_x0000_t75" style='width:415.5pt; height:193.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image029.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
Hessian服务端代码浅析
<!--[if !supportLists]-->1. <!--[endif]-->Spring配置如下:
<!--[if gte vml 1]><v:shape id="图片_x0020_20" o:spid="_x0000_i1028" type="#_x0000_t75" style='width:414.75pt;height:61.5pt; visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image031.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
从类HessianServiceExporter可以看出Hessian只接收Post请求
<!--[if gte vml 1]><v:shape id="图片_x0020_21" o:spid="_x0000_i1027" type="#_x0000_t75" style='width:415.5pt; height:196.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image033.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
通过继承链实现属性的注入:
在HessianExporter中可以注入: debug调试客户端请求参数
在RemoteExporter中可以注入:service serviceInterface
服务端主要是通过对请求参数的反序列化和对返回结果的反序列化,通过
HessianServiceExporter中的入口方法
<!--[if gte vml 1]><v:shape id="图片_x0020_23" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:415.5pt; height:145.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image035.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
调用以下方法来实现
<!--[if gte vml 1]><v:shape id="图片_x0020_22" o:spid="_x0000_i1025" type="#_x0000_t75" style='width:414.75pt; height:216.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\134891\AppData\Local\Temp\msohtmlclip1\01\clip_image037.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
相关推荐
Spring集成Hessian的过程主要包括以下几个步骤: 1. **定义服务接口**:首先,我们需要创建一个Java接口,包含服务提供者需要暴露给消费者的方法。例如,我们可以定义一个名为`UserService`的接口,包含用户查询、...
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。参考文档地址...
总之,Spring集成Hessian插件并改用自动注入可以极大简化服务的管理和调用。通过合理的配置和注解,我们可以实现服务的自动发现和依赖注入,提升代码的灵活性和可维护性。同时,理解并熟练掌握这一技术对于提升开发...
在Spring框架中集成Hessian,我们需要进行以下步骤: 1. **创建服务接口和服务实现**: 首先,你需要定义一个服务接口,然后实现这个接口。例如,我们有一个`HelloHessianService`接口,包含一个`sayHello`方法。 `...
下面将详细讲解Hessian与Spring集成的关键知识点。 首先,理解Hessian是什么至关重要。Hessian是一个二进制的Web服务协议,由Caucho公司开发。它提供了轻量级、高效的RPC(Remote Procedure Call)框架,使得Java...
要在Spring Web Flow项目中集成Hessian服务,我们需要以下步骤: 1. **配置Hessian服务**:在服务器端,我们需要创建一个实现了所需接口的业务服务类,并在Spring配置文件中声明它为Hessian服务,使用`<bean>`标签...
Spring AOP和Hessian是两个在Java开发中广泛使用的技术,尤其在分布式系统和服务治理中。下面将详细解释这两个概念以及它们如何结合使用。 **Spring AOP(面向切面编程)** Spring AOP是Spring框架的一个重要组成...
在本文中,我们将通过实例代码来介绍如何将 Hessian 集成到 Spring Boot 应用程序中。Hessian 是一个基于 RPC(Remote Procedure Call,远程过程调用)的轻量级框架,它提供了一个高效、灵活和可扩展的方式来实现...
标题 "外部接口调用 使用spring4+hessian4实例" 提供了一个关于如何...在实践中,深入学习和理解这些知识点,结合具体的代码示例,将有助于开发者熟练掌握Spring4和Hessian4的集成,从而实现高效、可靠的远程服务调用。
标题中的“spring整合hessian进行远程通讯”是指在Spring框架中使用Hessian库来实现远程过程调用(RPC)。这是一个常见的技术组合,用于构建分布式系统,使得应用组件之间可以跨网络进行高效通信。 Hessian是一种二...
三、Spring 4集成Hessian 4步骤 1. **创建服务提供者**:首先,我们需要定义一个服务接口及其实现。例如: ```java public interface HelloService { String sayHello(String name); } @Service(...
二、Spring集成Hessian Spring通过其AOP(面向切面编程)和IoC(控制反转)理念,为Hessian提供了便捷的整合方式。在Spring中,我们可以定义一个Service Bean,然后使用HessianExporter或者HessianProxyFactoryBean...
在Java开发中,Hessian和Spring是两个非常重要的框架,它们各自在不同的领域发挥着关键作用。Hessian是一种轻量级的远程方法调用(RPC)协议,它基于HTTP协议,能够有效地传输二进制数据,提高网络通信效率。而...
在"基于spring+hessian框架的webservice实例"中,我们将看到如何结合Spring和Hessian来创建和消费Web服务。首先,我们需要创建一个服务接口和服务实现。这个接口定义了可供远程调用的方法,而实现则提供了具体的功能...
2. 在Spring配置文件中声明Hessian服务bean,并指定其接口和实现。 3. 使用`HessianProxyFactoryBean`或`HessianServiceExporter`来暴露Hessian服务。 4. 在客户端,通过Spring的`HessianClientInterceptor`或者直接...