最近要做一个工作流的系统来支持子系统的上传,审批,复审,会签等操作,而一般传统的项目间交流主要是通过http调用另外的服务器的地址,返回一个json或是字符串,这种方式效率低,并且极其消耗资源,上家公司作为一个电商网站,有两个项目和一个中间件,每个项目之间信息处理全是通过http实现,由于优化不到位(应该是根本没有优化),经常会出现runtimeout的异常,而将runtime的时间设置太长也会影响用户体验,由于有些数据经常需要跨项目(数据库不同)查询或更新,导致异常经常出现。那时以为项目间就应该通过http传输,直到遇到Hessian,才知道可以这样利用第三方的http实现方案,这样更加方便和可靠。
(1).客户端:
a.发送远程调用请求:
客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>通过HTTP协议发送远程请求代理到服务端。
b.接收远程调用响应:
远程调用结果—>HTTP响应—>客户端。
(1).服务端:
a.接收远程调用请求:
远程调用HTTP请求—>HessianServiceExporter接收请求—>HessianExporter将远程调用对象封装为HessianSkeleton框架—> HessianSkeleton处理远程调用请求。
b.返回远程调用响应:
HessianSkeleton封装远程调用处理结果—>HTTP响应—>客户端。
Hessian的实现:服务端Hessian需要四个东西就可以提供服务了,一个interface的java;一个实现interface的impl的java;一个实现了Serializable的实体,用来返回需要的东西;一个配置好了的web.xml用来实现暴露出远程接口,写好服务端接口和实现,测试完毕后将接口类和实体类已jar包形式导出;
客户端Hessian需要服务器接口和实体的jat包,服务器端的路径,就可以轻松的将服务器端的服务引用出来,这样就达到了对服务器端的操作。
eg:
接口:public interface BasicAPI {
public void setGreeting(String greeting); public String hello(); public User getUser(); }接口实现:
public class BasicService implements BasicAPI {
private String _greeting = "Hello, world"; public void setGreeting(String greeting) { _greeting = greeting; System.out.println("set greeting success:"+_greeting); } public String hello() { return _greeting; } public User getUser() { return new User("prance", "meshow"); } }pojo实体:
public class User implements Serializable{
String userName ="snoopy"; String password ="showme"; public User(String user, String pwd) { this.userName =user; this.password= pwd; } public String getUserName() { return userName; } public String getPassword() { return password; } }web.xml配置:
<servlet>
<servlet-name>hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>service-class</param-name> <param-value>demo.BasicService</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>客户端可以是一个main启动方法
import demo.User;
import demo.BasicAPI; import com.caucho.hessian.client.HessianProxyFactory;public static void main(String[] args) {
//在服务器端的web.xml文件中配置的HessianServlet映射的访问URL地址
String url = "http://localhost:8081/OCROnline/hello"; HessianProxyFactory factory = new HessianProxyFactory(); BasicAPI service = (BasicAPI) factory.create(BasicAPI.class, url);//创建BasicAPI接口的实例对象 User user = service.getUser();//调用Hessian服务器端的BasicAPI类中的getUser方法来获取一个User对象 System.out.println(service.getUser().getPassword()); System.out.println(service.hello()); System.out.println(service.getUser() .getUserName());}运行main方法就能调用服务端的方法了,超级简单!超级方便!当然这比较适合为子系统提供服务。