Hessian 与 Spring 集成

简介

Hessian 是 caucho 公司提供的开源协议,基于 HTTP 传输的二进制的 RPC 协议,轻量级的远程调用框架。

因为采用的是二进制协议,所以它很适合于发送二进制数据。

服务端不用开防火墙端口,具有较好的穿墙能力。

协议的规范公开,可以用于任意语言。

 

基于 Hessian 的项目开发时

服务器端必须具备以下几点:

  1. 包含 Hessian 的 jar 包
  2. 设计一个接口,用来给客户端调用
  3. 实现该接口的功能
  4. 配置 web.xml,配好相应的 servlet
  5. 由于使用二进制 RPC 协议传输数据,对象必须进行序列化,实现 Serializable 接口
  6. 对于复杂对象可以使用 Map 的方法传递

 

客户端必须具备以下几点:

  1. 包含Hessian.jar的包。
  2. 具有和服务器端结构一样的接口。包括命名空间都最好一样
  3. 利用 HessianProxyFactory 调用远程接口。

 

加入的 jar 包:

hessian-core-2.1.12.jar

 

 

服务端

application-actions.xml:

<beans>
	<description>导出App服务的对Web提供的Action</description>
	<!-- 定义模块的Service -->
	<bean id="applicationAction" class="com.mes.framework.core.action.impl.ApplicationAction">
		<!-- 这个ApplicationAction能够访问的action的列表 -->
		<property name="actions">
			<list>
				……
			</list>
		</property>
	</bean>

        <!-- 暴露发布服务 -->
	<bean name="/serviceExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">
		<property name="serviceInterface">
			<value>com.mes.framework.core.action.Action</value>
		</property>
        <!-- 接口实现 -->
		<property name="service">
			<ref bean="applicationAction" />
		</property>
	</bean>

</beans>

 

 

web.xml:

 

<servlet>
        <servlet-name>remoting</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
		/WEB-INF/applicationContext-actions.xml,<!-- 导出服务的配置文件 -->
                ...
	    </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>remoting</servlet-name>
        <url-pattern>/remoting/*</url-pattern>
    </servlet-mapping>

 

客户端:

application-web-common.xml:

 

<bean id="memberDispatcher" class="com.mes.framework.core.remoting.client.support.HessianDispacher">
		<property name="controller">
			<ref local="memberApplicationController" />
		</property>
	</bean>
    <!-- Hessian代理工厂 -->
	<bean id="memberApplicationController" 
            class="com.mes.framework.core.remoting.caucho.MesHessianProxyFactoryBean"> 
		<property name="serviceUrl">
            <!-- properties文件: http://localhost:88/d2shop-member-app/remoting/serviceExporter 
            !!!-->
			<value>${member.app.url}</value>  
		</property>
		<property name="serviceInterface">
			<value>com.mes.framework.core.action.Action</value>
		</property>
		<property name="txnIDGenerator">
			<ref local="TxnIdGenerator" />
		</property>
		<property name="username">
			<value>${principal}</value>
		</property>
		<property name="password">
			<value>${credentials}</value>
		</property>
	</bean>

 

调用:

ControllerUtils 工具类:

部分代码:

public static Map<Object, Object> excute(String requestServiceId, 
            Map<Object, Object> condition, Dispatcher dispatcher) throws Exception {
	if (!requestServiceId.isEmpty() && dispatcher != null) {
		ServiceRequest serviceRequest = new ServiceRequest();
		serviceRequest.setRequestServiceId(requestServiceId);
		serviceRequest.setRequestObject(condition);
		return dispatcher.dispatcheService(serviceRequest).getModel();
	}
	return null;
}

 

Controller:

部分代码:

public class BusinessActionMultiController{

	@Resource
	private Dispatcher memberDispatcher;


	public ModelAndView ajaxRestPayPassword(HttpServletRequest request, HttpServletResponse response) throws Exception {
		PrintWriter out = ControllerUtils.getPrintWriter(response, logger, "------------BusinessActionMultiController.ajaxRestPassword start------------");
		try {
			SessionUser su = SessionUser.getSessionUser(request);
			Map<Object, Object> condition = new HashMap<Object, Object>();
			String rs = "1";
			String bid = StringUtil.trim(request.getParameter("bid"));
			if (su != null && StringUtil.hasText(bid)) {
				condition.put("bid", bid);
				condition.put("op", "ajaxRestPayPassword");
				Map<Object, Object> model = ControllerUtils.excute("kzBusinessAction", 
                                            condition, getMemberDispatcher());
				rs = StringUtil.trim(model.get("state"));
			}
			out.print(rs);
			return null;
		} catch (Exception e) {
			logger.error(e);
			return new ModelAndView("error", "error_view", "BusinessActionMultiController.ajaxRestPassword error...");
		}
	}

}

 

比较

协议的通讯效率依次为:RMI > Httpinvoker >= Hessian >> Burlap >> web service

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值