发表于: 2017-08-23 13:22:32
2 992
今天的完成的:
1、今天照着网上的例子搭了一个Spring 整合 Hessian 远程调用方法的 demo。
Hessian 也是一种远程过程调用(RPC)技术。
常见的远程调用技术还有:
RMI、Hessian、Burlap、Spring基于HTTP的远程服务、SOAP和RESTful风格的Web Service。
这个例子中,服务端的整合是通过SpringMVC进行的,我也不知道为什么它要和springMVC搅在一起。可是学习某样东西就是从囫囵吞枣开始的。
而客户端是通过spring的bean方式配置的。
①首先写服务端,先写一个service和 impl。
②接着在 web.xml 文件中配置一个 SpringMVC 的 dispatchServlet 用于处理所有 url为“/api/service/*”的请求。
③接着就能在 SpringMVC 的配置文件中定义远程服务了,
注意看,和任务8中的springRMI简直一样,是通过Spring提供的HessianServiceExporter来实现的,所以需要定义一个类型为 HessianServiceExporter的bean。
其中一个是 service 属性,用于关联 impl,另一个是 serviceInerface,用于指定接口。
注意看 HessianServiceExporter 的bean 的name 是“/userService”,在SpringMVC 的配置文件中,当你将一个 bean 的 name 是以“/”起始时、Spring 自动对它实行 BeanNameUrlHandlerMapping。
(万一没有自动映射,上图蓝色框框里自行指定的 BeanNameUrlHandlerMapping 可以确保映射)
所以这里就是将“/userService”映射到了HessianServiceExporter。
根据之前在 web.xml 的配置,我们真正访问这个 userServce 服务时的路径为“/api/service/userService”.
“HessianServiceExporter 实现了 HttpRequestHandler 接口,所以当用户访问某一个远程服务的时候实际上请求的就是其对应的 HessianServiceExporter 对象。
HessianServiceExporter 会把请求以二进制的方式返回给客户端。”
④客户端的整合
客户端想要访问 Hessian服务,只有备有一份和服务端相同的 interface 就行了。
(记得一个月前刚开始任务8的时候,纠结了很久客户端是否要和服务端保持一份同样的 service和impl 代码。
现在明白了,什么是面向接口,Hessian的这个远程过程调用,完全使用动态代理来实现的,,是典型的面向接口编程)
上面的配置文件意思为 通过HessianProxyFactoryBean定义了一个UserService对应的远程代理对象,之后在客户端调用的 userService 、就是这里一个普通的 spring bean 对象的 userService 代理对象。
⑤测试
第一步启动服务端,
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class HessianTest {
@Autowired
private UserService userService;
@Test
public void test() {
userService.addUser();
userService.updateUser();
userService.delUser();
String user = userService.findUser("ZhangSan");
System.out.println(user);
System.out.println("---------------------------------finished----------------------------------");
}
报错,说是路径找不到,过了一会恍然大悟,我用的是jetty,而且未指定项目名,应该把serverURL中的“hessianServer”给去了。
再测一遍,成功了。
明天计划:
1、
遇到的问题:
收获:
1、
2、
评论