浏览 15219 次
锁定老帖子 主题:Hessian学习记录
精华帖 (3) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (5)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-06
相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。 Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。 Hessian处理过程示意图: 客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果 环境搭建 Hessian的下载和安装请按如下步骤进行: (1)登http://www.caucho.com/hessian/下载Hessian。 (2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。 两种方式 纯Hessian 这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。 下面我就把我在做实例的一些相关步骤描述如下: 1:把Hessian相应jar包放入至工程中。 2:由于Hessian是采用面向接口编程的,所以编写一个接口,因为客户端仅仅需要接口,而无须真实的实现类。 package jzh.demo; public interface IHello { String sayHello(); } 3:编写一个类实现这个接口。 package jzh.demo.impl; import jzh.demo.IHello; import com.caucho.hessian.server.HessianServlet; public class Hello extends HessianServlet implements IHello { public String sayHello() { return "Hello world"; } } 4:web.xml的详细配置 <servlet> <servlet-name>Hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>jzh.demo.imple.Hello</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>jzh.demo.IHello</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/Hello</url-pattern> </servlet-mapping> 5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。 1) 把服务器端的生成的jar包,放入工程中。 2) 相应的片段程序如下: String url = "http://220.114.108.185:8080/Hessian/Hello"; HessianProxyFactory factory = new HessianProxyFactory(); try { IHello hello =(IHello)factory.create(IHello.class,url); System.out.println(hello.sayHello()); } catch (MalformedURLException e) { e.printStackTrace(); } 6:功能完成。 Hessian与Spring整合 相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。 所以Hessian与Spring整合主要就是一下两个工作: 1:通过DispatcherServlet来拦截URL请求。 2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。 下面我就把我在做实例的一些相关步骤描述如下: 1:和上面的一样。 2:和上面的一样。 3:和上面的一样。 4:web.xml的详细配置 <servlet> <servlet-name>remoting</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>remoting</servlet-name> <url-pattern>/remoting/*</url-pattern> </servlet-mapping> 5:配置remoting-servlet.xml文件 <!-- 定义普通bean实例--> <bean id="hello" class="jzh.demospring.impl.Hello"/> <!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务--> <bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter"> <!-- 需要导出的目标bean--> <property name="service" ref="hello"/> <!-- Hessian服务的接口--> <property name="serviceInterface" value="jzh.demospring.IHello"/> </bean> 6:客户端定义一个remoting-client.xml文件 <bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl"> <value>http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting</value> </property> <property name="serviceInterface"> <value>jzh.demospring.IHello</value> </property> </bean> 7:客户端调用。 try { ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml"); IHello hello =(IHello)context.getBean("myServiceClient"); System.out.println(hello.sayHello()); } catch (Exception e) { e.printStackTrace(); } 注意事项 1:启动tomcat的时候,出现如下问题:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。,而在工程中是可以找到相应的jar文件,这究竟是什么问题。 解决方法:可能是在工程的WEB-INF/lib下面没有加载相应的jar文件 2:org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService]; 解决方法:出现这个异常一般是因为服务端操作出现异常引起的 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-08-13
谢谢,正在学习怎么搭建hessian服务,看了以后帮助很大!
![]() |
|
返回顶楼 | |
发表时间:2008-08-19
我觉得RPC有两种方式,调用远程的方法:
1、方法在远程执行,将操作结果传回给客户端。优点:服务器负荷小,传输数据量小,客户端无需知道服务器端定义的服务接口。缺点:需要对数据进行拼装解析等复杂操作。 2、方法加载到客户端运行。优点:可以和缓存配合,每次运行只传输一次,可靠性高,有些方法没有返回值,只是进行例如print的打印语句能在客户端运行。缺点:传输数据大,客户端需要知道服务接口。 我猜想 IHello hello =(IHello)factory.create(IHello.class,url); System.out.println(hello.sayHello()); 它是第二种方式 |
|
返回顶楼 | |
发表时间:2008-08-29
其实,它采用的是第一种方式,是在远程执行,而非是你说的第二种
|
|
返回顶楼 | |
发表时间:2009-03-20
问个 问题
5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。 1) 把服务器端的生成的jar包,放入工程中。 如果,我在服务端用Java ,客户端用C#, 怎么添加? 还是要在客户端,把server的interface 和 object 再定义一次 ? |
|
返回顶楼 | |