在XFire1.2以後支持SOAP消息的GZip壓縮傳輸,在合適的地方啓動GZip壓縮可以減少網絡傳輸的數據量,加快速度。
在XFire中啓動GZip壓縮要用到一個開源的Filter:PJL Compressing Filter。這個Filter的最新版本是,自1.5.0開始該工程開始構建於JDK5.0,因此在JDK1.4環境下只能使用1.4.6(這個版本會與高版本同步更新)。[http://sourceforge.net/projects/pjl-comp-filter/]
一、服務端啓動GZip:在服務端啓動GZip只需將PJL Compressing Filter下的jar包(用到的)導入到web的/WEB-INF/lib目錄下。並在web.xml文件中增加如下配置:
<filter>
<filter-name>CompressingFilter</filter-name>
<filter-class>
com.planetj.servlet.filter.compression.CompressingFilter
</filter-class>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>statsEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CompressingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
代碼清單7-1:服務端加入GZip時web.xml中增加的配置
注:根據web.xml文法定義,這個定義必須位於servlet定義之前。
二、客戶端啓用GZip:客戶端啓動GZip只要將客戶端的GZip的屬性設爲true卻可。代碼如下:
String serviceURL = "http://192.168.0.225/ldaxfire/services/LDAService";
// 創建service對象
Service serviceModel = new ObjectServiceFactory().create(
ServiceInterface.class, null, "http://test.yicha.cn/adreport", null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
// 獲取服務對象
ServiceInterface service = (ServiceInterface) serviceFactory.create(
serviceModel, serviceURL);
// 獲取客戶端代理
Client client = ((XFireProxy) Proxy.getInvocationHandler(service))
.getClient();
// 啓動response壓縮
client.setProperty(CommonsHttpMessageSender.
GZIP_RESPONSE_ENABLED, Boolean.TRUE);
// 啓動request壓縮
client.setProperty(CommonsHttpMessageSender.
GZIP_RESPONSE_ENABLED,Boolean.TRUE);
// 同時啓動response和request壓縮
client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,
Boolean.TRUE);
// 忽略超時
client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");
// 調用服務
data = service.serviceMethod();
代碼清單7-2:客戶端調用的修改
注:在同時啓用時,不必再分別啓用response和request的GZip壓縮。
注意,當服務端沒有啓用GZip,客戶端啓用請求GZip壓縮時,會產生SOAP解析錯誤,如果服務端啓動了GZip壓縮功能,客戶端是否啓用GZip都沒有影響。