在Spring中使用Hessian Remoting技术

http://blog.csdn.net/caihaijiang/article/details/5903253

Spring目前提供了对RMI、 HttpInvoker、Hessian、Burlap及WebService等Remoting技术的集成。Spring屏蔽了这些实现技术的差异,用户只需开发简单的Java对象(Plain Old Java Objects,POJO)然后按照Spring规定的格式进行配置文件的编写即可。

一、几种Remoting实现的比较

Spring支持的Remoting实现技术是非常多的,虽然Spring屏蔽了这些技术使用上的差异,但是选择一个合适的Remoting技术仍然对系统有非常积极的作用,下面就来讲述这些实现技术的优缺点。

(1) RMI:RMI使用Java的序列化机制实现调用及返回值的编组(marshal)与反编组(unmarshal),可以使用任何可序列化的对象作为参数和返回值。其缺点是RMI只能通过RMI协议来进行访问,无法通过HTTP协议访问,无法穿透防火墙。

(2) Hessian:Hessian也是将网络传输的对象转换为二进制流通过Http进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型是有限制的,不支持复杂的对象。Hessian的优点是可以透过防火墙。Hessian是一个轻量级的remoting on http工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据

(3) Burlap:Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本,可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。

(4) HttpInvoker:HttpInvoker将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。 Http Invoker是使用Http协议传输二进制流的,而同时又具有Hessian、Burlap的优点。

Hessian、Burlap、HttpInvoker等是要运行在支持Servlet的web服务器中。

 

二、Spring中使用Hessian Remoting技术

使用步骤如下:

     1、在web.xml中的配置

<context-param>  

    <param-name>contextConfigLocation</param-name>  

    <param-value>  

        /WEB-INF/config/applicationContext.xml,   

        /WEB-INF/Hessian-servlet.xml   

    </param-value>  

</context-param>  

           

<servlet>  

    <servlet-name>Hessian</servlet-name>  

    <servlet-class>  

        org.springframework.web.servlet.DispatcherServlet   

    </servlet-class>  

    <load-on-startup>1</load-on-startup>  

</servlet>  

           

<servlet-mapping>  

    <servlet-name>Hessian</servlet-name>  

    <url-pattern>/hessian/*</url-pattern>  

</servlet-mapping>  

       1)Hessian要求远程服务通过Servlet暴露出来,所以我们使用Spring的DispatcherServlet来暴露我们的服务。

        2)我们必须在WEB-INF目录下创建一个文件名格式为 [Servlet Name]-servlet.xml 的配置文件,由于我们设定servlet-name为Hessian,所以我们在这里创建一个名为Hessian-servlet.xml的文件。

    2、Hessian-servlet.xml文件的配置

Xml代码

<!-- 业务类 -->  

<bean id="hessianService" class="com.cjm.webservice.hessian.HessianServiceImpl"/>  

<!-- 远程服务 -->  

<bean name="/hessianService" class="org.springframework.remoting.caucho.HessianServiceExporter">  

    <property name="service" ref="hessianService"/>  

    <property name="serviceInterface">  

        <value>  

            com.cjm.webservice.hessian.HessianService   

        </value>  

    </property>  

</bean>  

       

        1)实际业务类是通过Spring的HessianServiceExporter类来暴露给客户端的。

        2)service:指定服务对应的业务类。

        3)serviceInterface:指定业务类实现哪个接口。Spring推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。

        4)Hessian的远程服务名为/hessianService。笔者使用的web服务器是Tomcat-5.5.23,端口是8888,web应用名为spring2,则远程服务的URL为:http://localhost:8888/spring2/hessian/hessianService。

 

    3、业务类源代码

Java代码

//接口类:   

public interface HessianService {   

    public String sayHello(String username);   

    public HessianModel getHessianModel(String username, String password);   

}   

           

//实现类:   

public class HessianServiceImpl implements HessianService {   

    public String sayHello(String username){   

        return "Hello " + username;   

    }    

 

    public HessianModel getHessianModel(String username, String password) {   

        return new HessianModel(username, password);   

    }   

}   

           

//领域模型类:   

public class HessianModel implements Serializable{   

    private String username;   

    private String password;   

                   

    public HessianModel(String username, String password){   

        this.username = username;   

        this.password = password;   

    }   

    ……   

}  

 

4、客户端调用服务范例

         1)在Jsp页面中调用服务

Java代码

String url = "http://localhost:8888/spring2/hessian/hessianService";   

HessianProxyFactory factory = new HessianProxyFactory();   

HessianService hessianServer =    

            (HessianService)factory.create(HessianService.class, url);   

String ret = hessianServer.sayHello("Raymond.chen");   

out.print(ret);   

HessianModel model = hessianServer.getHessianModel("uid", "pwd");  

out.print("username: " + model.getUsername() + "<br>");  

             A)结果显示:Hello Raymond.chen

             B)客户端程序必须引用hessian-3.0.20.jar文件和远程服务对应的接口类。

             C)当调用的远程服务方法返回一个自定义类时,该自定义类必须实现Serializable接口。

 

       2)在Spring环境中调用服务

Xml代码

<bean id="testHessianService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  

    <property name="serviceUrl" value="http://localhost:8888/spring2/hessian/hessianService"/>  

    <property name="serviceInterface" value="com.cjm.webservice.hessian.HessianService"/>  

</bean>  



    <servlet-mapping>
        <servlet-name>remoting</servlet-name>
        <url-pattern>/api/trade/*</url-pattern>
    </servlet-mapping>


<!- Struts2中调用服务 -->  

<bean id="orgAction" class="com.cjm.web.action.OrganizationAction" parent="baseAction">  

    <property name="organizationService" ref="organizationService"/>  

    <property name="testHessianService" ref="testHessianService"/>  

</bean>  

   

OrganizationAction.java部分源代码:

Java代码

private HessianService testHessianService;   

HessianModel model = testHessianService.getHessianModel("uid", "pwd");   

System.out.println("username: " + model.getUsername());  

       

        A)使用HessianProxyFactoryBean来连接服务。

        B)serviceUrl:远程服务的URL。

        C)serviceInterface:服务对应的接口类。


如果需要改用Burlap,则将上面的 HessianServiceExporter改成BurlapServiceExporter,HessianProxyFactory改成 BurlapProxyFactory就可以,接口和实现类的代码均不需要修改;同样如果要改用HttpInoker,只要将上面的 HessianServiceExporter改成HttpInvokerService- Exporter,将HessianProxyFactory改成HttpInvokerProxyFactoryBean就可以了。


Hessian事例:

<?xml version="1.0" encoding="UTF-8" ?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean name="/UserService" class="org.springframework.remoting.caucho.HessianServiceExporter">
        <property name="service" ref="userService" />
        <property name="serviceInterface" value="com.banksteel.member.service.UserService" />
    </bean>

    <bean name="/MemberService" class="org.springframework.remoting.caucho.HessianServiceExporter">
        <property name="service" ref="memberService" />
        <property name="serviceInterface" value="com.banksteel.member.service.MemberService" />
    </bean>

    <bean name="/MemberWarehouseService" class="org.springframework.remoting.caucho.HessianServiceExporter">
        <property name="service" ref="memberWarehouseService" />
        <property name="serviceInterface" value="com.banksteel.member.service.MemberWarehouseService" />
    </bean>
</beans>

package com.banksteel.api;

import java.net.MalformedURLException;
import java.util.List;

import com.banksteel.jifen.entity.JifenUserAddress;
import com.banksteel.jifen.service.JifenUserAddressService;
import com.banksteel.member.entity.Member;
import com.banksteel.member.entity.User;
import com.banksteel.member.service.MemberService;
import com.banksteel.member.service.UserService;
import com.caucho.hessian.client.HessianProxyFactory;

/**
 * @author zhaiang
 *
 */
public class HessianTest
{
    public static void main(String[] args)
    {
        String url = "http://192.168.100.203:8097/api/trade/JifenUserAddressService";
//        String url = "http://192.168.100.203:8097/api/trade/MemberService";
//        String url = "http://192.168.100.203:8097/api/trade/UserService";
            // String url1 = "http://localhost:8085/banksteel-solrindexserver/api/resource/WeiXinSearchLogService";
            // String url2 = "http://localhost:8085/banksteel-solrindexserver/api/resource/VipCustomerService";
            // String url3 = "http://localhost:8084/steelResourceService";

        HessianProxyFactory factory = new HessianProxyFactory();
        try
        {
            JifenUserAddressService jifenUserAddressService = (JifenUserAddressService) factory.create(JifenUserAddressService.class, url);
            
             JifenUserAddress jifenUserAddress = jifenUserAddressService.getJifenAddressById(176);
             System.out.println(jifenUserAddress);
             System.out.println(jifenUserAddress.getId());
             System.out.println(jifenUserAddress.getMobile());
             System.out.println(jifenUserAddress.getProvince() + jifenUserAddress.getCity());
            
             List<JifenUserAddress> jsm = jifenUserAddressService.getJifenUserAddresses(47001);
             System.out.println(jsm.size());
             System.out.println(jsm);    
            
//             MemberService memberService = (MemberService) factory.create(MemberService.class,url);
//             Member member = memberService.getMemberById(12474L);
//             System.out.println(member);
//             System.out.println(member.getId());
//             System.out.println(member.getName());
//             System.out.println(member.getShortName());
            
//            UserService userService  = (UserService) factory.create(UserService.class,url);
//            
//             User user = userService.getUserById(75L);
//             System.out.println(user);
//             System.out.println(user.getId());
//             System.out.println(user.getName());
//             System.out.println(user.getMobile());
//            
//             User usermobile = userService.getUserByMobile("18637561234");
//             System.out.println(usermobile);
//             System.out.println(usermobile.getId());
//             System.out.println(usermobile.getName());
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }

    }
}




 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值