`
haiziwoainixx
  • 浏览: 409998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

小试Hessian

 
阅读更多

简介:

    Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的初衷就是支持动态类型,格式紧凑,跨语言Hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下RMI:RMI是一组用户开发分布式应用程序的API。他使用的是java序列化机制实现调用及返回值的编组于反编组。它使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因为传统的RPC并不能很好的应用于分布式对象系统。而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。他也有它的缺点,他只能通过RMI协议来进行访问无法通过HTTP协议访问,无法穿透防火墙。
    还有一种远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的优点。

下载地址:http://hessian.caucho.com/#Java

 

一.简单示例

1.服务端:

(1)下载相关jar报并添加到工程中

(2)编写接口,例子:

 

 

package com.youyuan.service;

/**
 * @author 张海涛
 * @Date 2014年6月18日 下午5:05:51
 * 
 */
public interface HessianUserService {
	
	public String getUserName(int userID);
}

 

 

(3)编写业务类,继承HessianServlet 并实现上诉接口HessianUserService

 

package com.youyuan.service.impl;

import com.caucho.hessian.server.HessianServlet;
import com.youyuan.service.HessianUserService;

/**
 * @author 张海涛
 * @Date 2014年6月18日 下午5:13:52
 * 
 */
public class UserServiceImpl extends HessianServlet implements HessianUserService{

	@Override
	public String getUserName(int userID) {
		System.out.println("this is UserService ");
		return "test"+userID;
	}

}

 

 

(4)在web.xml中配置相关servlet

 

	<servlet>
		<servlet-name>userService</servlet-name>
		<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
		<init-param>
			<param-name>service-class</param-name>
			<param-value>com.youyuan.service.impl.UserServiceImpl</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>userService</servlet-name>
		<url-pattern>/youyuan/user_service</url-pattern>
	</servlet-mapping>

 

 

(5)测试

访问:http://localhost:8080/test-hessian-server/youyuan/user_service

出现如下页面,即表示成功:



 

2.客户端

(1)将服务端service打包,只打包接口即可,引入工程

(2)将hessian相关jar包引入工程

(3)编写一个简单测试类

package com.youyuan.test.hessian;

import java.net.MalformedURLException;

import com.caucho.hessian.client.HessianProxyFactory;
import com.youyuan.service.HessianUserService;

/**
 * @author 张海涛
 * @Date 2014年6月18日 下午5:41:02
 * 
 */
public class TestHessian {
	public static void main(String[] args) {
		HessianProxyFactory factory = new HessianProxyFactory();
		try {
			HessianUserService userService = (HessianUserService) factory.create(HessianUserService.class,"http://localhost:8080/test-hessian-server/youyuan/user_service");
			System.out.println(userService.getUserName(99));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		
	}
}

 运行成功!

 

 

 二.与resin整合

 参考:http://caucho.com/resin-3.1/examples/hessian-ioc/index.xtp

1.下载安装resin,参考: http://haiziwoainixx.iteye.com/blog/2082298

2.配置

(1)服务器端(使用resin,会自动加载该配置文件)

   将实现类中的extends HessianServlet代码去掉,同时在WEB-INF下配置resin-web.xml

 

<web-app xmlns="http://caucho.com/ns/resin">
<servlet>
        <servlet-name>userService</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
            <param-name>home-class</param-name>
            <param-value>com.youyuan.service.impl.HessianUserServiceImpl</param-value>
        </init-param>
        <init-param>
            <param-name>home-api</param-name>
            <param-value>com.youyuan.service.HessianUserService</param-value>
        </init-param>
    </servlet>
 <servlet-mapping>
        <servlet-name>userService</servlet-name>
        <url-pattern>/hessian/user_service</url-pattern>
    </servlet-mapping>

</web-app>
 

 

(2)客户端(使用resin)

同样在WEB-INF下配置resin-web.xml,单并无特别之处,不建议使用

 

 

 三.与spring整合

1.服务器端

(1)在web.xml中加入以下代码

 

<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>
	
	<!-- 使用spring的DispatcherServlet代理hessian接口 -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/hessian/*</url-pattern>
	</servlet-mapping>
 

 

(2)在spring配置文件中引入以下bean

 

<!-- 实际业务处理类 -->
    <bean id="localHessianUserServiceImpl" class="com.youyuan.test.hessian.LocalHessianUserServiceImpl"/>
    <bean name="/local_user"  class="org.springframework.remoting.caucho.HessianServiceExporter">
        <property name="service" ref="localHessianUserServiceImpl"/>  
        <property name="serviceInterface" value="com.youyuan.test.hessian.LocalHessianUserService" /> 
    </bean>
 以上配置完成后,该接口的调用路径为:http://localhost:8080/demo/hessian/local_user
访问地址一定要与action的地址区分开,否则sping会代理不到

 

注意该种配置方式必须引入:aopalliance-1.0.jar 否则报以下错误:

ERROR - Context initialization failed
java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)

 

2.客户端

在spring中配置以下bean

 

    <bean id="hessianProxyFactory" class="com.caucho.hessian.client.HessianProxyFactory">
        <property name="overloadEnabled" value="true"/>
    </bean>
    
    <bean id="hessianUserService" factory-bean="hessianProxyFactory" factory-method="create">
        <constructor-arg type="java.lang.Class" value="com.youyuan.service.HessianUserService"/>
        <constructor-arg type="java.lang.String" value="http://${hessian.server}/test-hessian-server/hessian/user_service"/>
    </bean>

 

 

然后注入到相关bean中即可使用

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics