昨天寫了一篇關于ICE的接口如何實作的文章,突然想到我們今年接口測試過程中可能也會遇到hessian類型的接口,為此乘這兩天有空把hessian接口也學習一下。由于學習是為了以後測試工作而進行的,是以對于hessian和soap機制孰優孰劣就沒有深入的研究,這些問題還是留給我們架構師來研究吧。根據網上的文獻:Hessian是采用二進制流進行通訊的,是以我想性能應該會好一些,既然通過二進制流傳遞,是不是對複雜對象的傳遞有問題呢,我想可能會有些難度,畢竟傳遞過程中沒有象soap這樣保留了對象的結構的。這個問題有待以後考證。今天我想把我第一次學習hessian的經曆分享一下。
和ICE,WebService一樣,既然作為服務類那麼必須有文檔公布它的接口形式,用戶端使用者在通過這個文檔來生成代理類。ICE是通過.Ice檔案,WebService是通過wsdl,但是hessian沒有這個類型的文檔,hessian的代理類是直接通過factrory去生成的。是以在做hessian用戶端代碼之前,需要拿到接口檔案interface。下面我們通過一個完整的例子看看hessian伺服器端代碼和用戶端代碼如何實作。
伺服器端代碼和配置:
1. 去http://hessian.caucho.com/#Java 下載下傳hessian jar包。
2. 建立伺服器端工程(web工程:hessian),新增接口聲明檔案new->interface。代碼如下:
1 package Hessian;
2
3 public interface Printer {
4 public String printstr(); //與服務端的printstr方法對應
5 }
3. 建立伺服器類實作代碼,new->class,代碼如下
01 package Hessian;
02
03 public class PrinterService implements Printer{
04
05 public String printstr() {
06 // TODO Auto-generated method stub
07 return "helloworld";
08 }
09
10 }
4. 修改伺服器端web.xml檔案如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>Hessian.PrinterService</param-value>
</init-param>
<param-name>home-api</param-name>
<param-value>Hessian.Printer</param-value>
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/aaa</url-pattern>
</servlet-mapping>
</web-app>
上述代碼實作如下功能:
* 指定接口的url
* 指定API使用的inteface檔案
* 指定伺服器類實作的代碼
5. 導出工程為hessian.war,部署到tomcat5的webapps目錄下。
6. 将hessian jar包拷貝到lib目錄下。
用戶端代碼:
1. 建立用戶端工程,新增測試類,代碼如下
03 import com.caucho.hessian.client.HessianProxyFactory;
05 public class TestClient {
06 public static void main(String []args)
07 throws Exception
08 {
09 String url = "http://10.0.68.183:8080/Hessian/aaa";
10 //建立factory執行個體
11 HessianProxyFactory factory = new HessianProxyFactory();
12 //用戶端需實作Basic接口
13 Printer printer = (Printer) factory.create(Printer.class, url);
14
15 System.out.println("Hessian: " + printer.printstr());
16 }
17
18 }
運作用戶端代碼:可以看見Hessian helloworld。
如果讀者有興趣使用comview去捕捉實際傳遞的内容,發現根本看不懂傳遞的内容,因為是以二進制流進行傳遞的。