hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速。官网地址:http://hessian.caucho.com/
目前已经支持N多语言,包括:java/c#/flex/php/ruby…
maven的依赖项如下:
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
入门示例:
一、服务端开发
1.1 先建服务接口
public interface HelloService {
public String helloWorld(String message);
}
1.2 提供服务实现
import yjmyzz.cnblogs.com.service.HelloService;
public class HelloServiceImpl implements HelloService {
@Override
public String helloWorld(String message) {
return "hello," + message;
}
}
1.3 修改web.xml
<servlet>
<servlet-name>hessian-service</servlet-name>
<servlet-class>
com.caucho.hessian.server.HessianServlet
</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>
<!-- 服务实现类 --yjmyzz.cnblogs.com.service.impl.HelloServiceImpl
</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<!-- 服务接口 -->
yjmyzz.cnblogs.com.service.HelloService
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hessian-service</servlet-name>
<url-pattern>/hessian</url-pattern>
</servlet-mapping>
部署到tomcat或其它web容器中即可。
1.4 导出服务接口jar包
最终服务是提供给客户端调用的,客户端必须知道服务的接口信息(包括接口方法中的传输dto定义),所以得将这些java文件导出成jar,提供给调用方。
方法很简单:eclipse中在接口package(包括dto对应的package)上右击,选择Export
再选择Jar File
二、客户端调用
同样先添加maven的hessian依赖项,同时引入上一步导出的服务接口jar包,然后参考下面的示例代码:
import java.net.MalformedURLException;
import org.junit.Test;
import yjmyzz.cnblogs.com.service.HelloService;
import com.caucho.hessian.client.HessianProxyFactory;
public class ServiceTest {
@Test
public void testService() throws MalformedURLException {
String url = "http://localhost:8080/hessian-showcase/hessian";
System.out.println(url);
HessianProxyFactory factory = new HessianProxyFactory();
HelloService helloService = (HelloService) factory.create(HelloService.class, url);
System.out.println(helloService.helloWorld("jimmy"));
}
}
三、不可行方案
在做项目中,有些二进制数据要传输,故选择了hessian,但在实际过程中,存在以下问题迟迟不能解决。
1.项目为API接口,采用SpringJDBC+Spring,有着标准的dao、service、control层,前端采用DispatcherServlet进行分发。
2.当配置完Hessian后,简单的传输都能完成,但项目的业务逻辑是:需要传输的数据需要调用其他Service的Impl。故想以@AutoWired将Service的Impl注入至Hessian的Service中,并进行调用。但是注入结果为空。即Hessian不会调用Spring配置文件对包注解进行扫描。百思不得其解。希望有人做过相关功能并解决的话给我留言,不慎感激。
另:在采用Hession之前,还曾尝试使用标准的Restful进行二进制数据传输,发现服务器端产生数据和客户端接收数据居然不同。认为是Http协议将我需要传递的数据强行做了转换,不知道对不对。(二进制的数据是String类型的字符串通过Gzip压缩得来的。产生的byte[]中存在-23这类的负值,一般可读的String型数据转为byte[]后,其值均为正值)