Hessian官网:http://hessian.caucho.com/
hessian是二进制web service协议。
Hessian介绍
创建Hessian服务包括四个步骤:
- 创建Java接口,用于提供公开服务
- 使用HessianProxyFactory创建客户端
- 创建服务实现类
- 在servlet引擎中配置服务
<!--more-->
HelloWorld服务
public interface BasicAPI {
public String hello();
}
服务实现
public class BasicService extends HessianServlet implements BasicAPI {
private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
}
public String hello()
{
return _greeting;
}
}
客户端实现
String url = "http://hessian.caucho.com/test/test";
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
System.out.println("hello(): " + basic.hello());
部署标准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>
<url-pattern>/hello</url-pattern>
<servlet-name>hello</servlet-name>
</servlet-mapping>
</web-app>
Hessian序列化
Hessian类可以用来做序列化与反序列化
序列化
Object obj = ...;
OutputStream os = new FileOutputStream("test.xml");
Hessian2Output out = new Hessian2Output(os);
out.writeObject(obj);
os.close();
反序列化
InputStream is = new FileInputStream("test.xml");
Hessian2Input in = new Hessian2Input(is);
Object obj = in.readObject(null);
is.close();
如果要序列化比基础类型或String类型更加复杂的java对象,务必确保对象实现了java.io.Serializable接口。
Hessian处理大量数据
分布式应用需要发送大量二进制数据时,使用InputStream会更加有效率,因为它避免了分配大量byte数组。方法
参数中只有最后一个参数可能是InputStream,因为数据是在调用过程中读的。
下面是一个上传文件的API的例子
package example;
public interface Upload {
public void upload(String filename, InputStream data);
}
如果返回结果是InputStream,客户端必须在finally块中调用InputStream.close()方法,因为Hessian不会关闭
底层HTTP流,直到所有数据被读取并且input stream被关闭。
文件下载API:
package example;
public interface Download {
public InputStream download(String filename, InputStream data);
}
文件下载实现:
InputStream is = fileProxy.download("test.xml");
try {
... // read data here
} finally {
is.close();
}