您的位置:首页 > 其它

Hessian一个入门案例

2013-11-30 15:36 417 查看

一、Hessian简介

Hessian与WebService一样,可以完成远程方法调用。

例如,某公司已经有了CRM系统,之后想开发一个物流系统,而物流系统的客户信息需要用到CRM系统中的客户信息,这就需要从新的物流系统去掉用CRM系统的方法获取客户数据。我们通常可以在一个系统内调用系统内的方法,但是一般不可以调用其他系统的方法,而且有的时候,我们需要的其他系统的方法并不一定与我们使用的是同一种程序设计语言,而且这两个系统一般不在同一台服务器上。想要完成这种远程方法调用,可以借助Hessian完成。

Hessian使用标准协议进行数据传输。相当于分布式的数据交互。

RMI(Java Remote Method Invocation)Java远程方法调用。

其实在Java的内部就提供了RMI的接口。但是如果使用Java提供的RMI,会有一个问题,只局限Java的调用。

几种技术效率的比较:
RMI > Httpinvoker >= Hessian>>Burlap >> WebService
RMI是Java自带的,有局限性,只限于Java程序之间的远程访问。
Httpinvoker使用Java的序列化技术传输对象,与RMI本质上是一样的,从效率上看,二者也相差无几。
效率最低的就是WebService,为啥还有大量的人在用呢?因为使用的是xml文档,协议标准。

Hessian:
Hessian在传输少量对象的时候,比RMI还要快速,但传输数据结构复杂的对象或大量数据对象的时候,比RMI要慢20%,但只是在数据量特别大的时候。
Hessian是基于Binary-RPC协议实现的,是一种二进制数据格式,所以可以跨不同的语言平台,所以不管是Java,还是.NET都可以使用。

二、Hessian下载

http://hessian.caucho.com/#Java



三、Hessian应用简单入门案例

建立两个WEB项目:
一个server(服务端),一个client(客户端),模拟两个不同的系统,client调用server的功能。

将Hessian的jar包导入到lib中。



在服务端建立提供外界调用的方法的接口。
public interface HelloService {
public String sayHello();
}

提供这个接口的实现类。
public class HelloServiceImpl implements HelloService{
public String sayHello() {
return "Hello Service!!!";
}
}

写到这里,client还是不可以访问server的功能的,需要配置Hessian的服务。配置服务就可以被远程调用了。
配置方式可以参考Hessian的文档:Hessian.mht



点击这里的标准的web.xml配置信息可以获取标准示例:



web.xml
<web-app>
<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>example.BasicService</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>example.Basic</param-value>
</init-param>
</servlet>

<servlet-mapping>
<!—配置访问路径,当前访问路径是根目录下的hello,可以改成自己需要的-->
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

将这一段贴到server端的web.xml中。可以看到,其实就是配置一个servlet。
这一段中,红色加粗的部分需要我们改动。修改为:
<init-param>
<!-- 实现类,将<param-value>改为实现类的全限定名称 -->
<param-name>home-class</param-name>
<param-value>service.HelloServiceImpl</param-value>
</init-param>
<init-param>
<!-- 接口,将<param-value>改为接口的全限定名称 -->
<param-name>home-api</param-name>
<param-value>service.HelloService</param-value>
</init-param>

配置完成,将server发布到tomcat中,运行tomcat,在客户端就可以调用这个接口。
在浏览器输入:http://localhost:8080/server/hello就可以访问。



此时显示这个界面,说Hessian需要一个post请求。

下一步我们做client。
在客户端我们已经引入了Hessian的jar包,但是我们不能什么都不写就直接调用server的方法。必须把接口统一。
将server的接口连同包一起复制到client中,如图:



接口的内容是一样的:
public interface HelloService {
public String sayHello();
}

有了这个接口之后,就可以建立我们的测试用例了。可以在client新建立一个test包,并建立一个HessianTest测试类。



使用junit测试。
现在要在client调用服务器的地址,这个地址就是我们刚才在浏览器输入的地址:http://localhost:8080/server/hello
注意,真实环境中,localhost是一个IP地址,因为一般server和client是在不同的服务器中的。
测试类咋写呢?
在Hessian的文档中有示例代码:
Hessian Client for Basic service
package example;

import com.caucho.hessian.client.HessianProxyFactory;

public class BasicClient {
public static void main(String []args)
throws Exception
{
String url = "http://www.caucho.com/hessian/test/basic";

HessianProxyFactory factory = new HessianProxyFactory();
Basic basic = (Basic) factory.create(Basic.class, url);

System.out.println("Hello: " + basic.hello());
}
}

用到的核心类是HessianProxyFactory工厂类。
import java.net.MalformedURLException;

import org.junit.Test;

import service.HelloService;

import com.caucho.hessian.client.HessianProxyFactory;

public class HessianTest {
@Test
public void hessianDemo() throws MalformedURLException {
//定义访问远程主机的地址
String target = "http://localhost:8080/server/hello";
//获取工厂对象
HessianProxyFactory factory = new HessianProxyFactory();
//通过工厂的create方法,获取HelloService接口的实现类,
//第一个参数是要获取的对象的类型,第二个是要访问主机的地址
//获取的helloService对象其实是服务器端的一个HelloService的代理对象,
//我们使用其方法的时候实际访问的是远程主机的方法
HelloService helloService =
(HelloService) factory.create(HelloService.class, target);

//调用远程主机的功能。
System.out.println(helloService.sayHello());
}
}

控制台显示信息:



至此,成功的从client访问了server的实现类的sayHello方法。

Hessian的通信原理:
helloService.sayHello()
在调用这一句的时候,其实是在底层访问了我们指定的地址,我们指定的地址是一个servlet,所以这里实际访问的是这个servlet(HessianServlet),这个servlet就去找你指定的接口注册的实现类(在server的web.xml中注册),再从这个实现类中找到这个方法,再将这个方法的返回值变为二进制返回到client。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: