最近要作一個工做流的系統來支持子系統的上傳,審批,複審,會籤等操做,而通常傳統的項目間交流主要是經過http調用另外的服務器的地址,返回一個json或是字符串,這種方式效率低,而且極其消耗資源,上家公司做爲一個電商網站,有兩個項目和一箇中間件,每一個項目之間信息處理全是經過http實現,因爲優化不到位(應該是根本沒有優化),常常會出現runtimeout的異常,而將runtime的時間設置太長也會影響用戶體驗,因爲有些數據常常須要跨項目(數據庫不一樣)查詢或更新,致使異常常常出現。那時覺得項目間就應該經過http傳輸,直到遇到Hessian,才知道能夠這樣利用第三方的http實現方案,這樣更加方便和可靠。java
(1).客戶端:web
a.發送遠程調用請求:數據庫
客戶端程序—>發送遠程調用請求—>Hessian客戶端攔截器—>封裝遠程調用請求—>Hessian代理—>經過HTTP協議發送遠程請求代理到服務端。json
b.接收遠程調用響應:服務器
遠程調用結果—>HTTP響應—>客戶端。app
(1).服務端:框架
a.接收遠程調用請求:oop
遠程調用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方法就能調用服務端的方法了,超級簡單!超級方便!固然這比較適合爲子系統提供服務。