发表于: 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、



返回列表 返回列表
评论

    分享到