xfire 客户端调用webservice注意要点
1.超时控制:
1.1必要性:如果按照默认的时间去处理,不及时控制超时时间,当服务端接口或者网络出现异常时,客户端请求不能及时释放以至于到达应用服务器的最大线程后有可能会直接down掉应用服务器。
1.2超时类型:
1.2.1 webservice服务端服务器挂掉或者网络异常导致无法调用服务端接口
设置超时方法:
HttpClientParams params = new HttpClientParams();
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, (long)3000);
1.2.2 当webservice服务端网络正常,但是服务接口中出现异常一直不返回结果或者很久才返回结果,这种情况不可能服务客户端不可能长时间等待,数据实时性不高,导致应用的感知度很差。
设置超时方法:
params.setSoTimeout(1000*20);)//20秒超时抛异常
控制socket请求通信的超时时间。捕获异常后返回相应的业务处理信息
2.客户端与接口服务端握手方式:
如果接口传输内容数据量不大建议关闭长连接,提高接口性能。
params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE,Boolean.FALSE);//关闭长连接
3.如果接口传输数据量很大建议采用GZip压缩方式传输,提高接口性能
在XFire中启动GZip压缩要用到一个开源的Filter:PJL Compressing Filter。这个Filter的最新版本是1.7,自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必须放在servlet前面
<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>
客户端启用GZip:客户端启动GZip只要将客户端的GZip的属性设为true却可
// 启动response压缩
client.setProperty(CommonsHttpMessageSender.GZIP_RESPONSE_ENABLED,Boolean.TRUE);
// 启动request压缩
client.setProperty(CommonsHttpMessageSender.GZIP_REQUEST_ENABLED,Boolean.TRUE);
// 同时启动response和request压缩
client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,Boolean.TRUE);
注意,当服务端没有启用GZip,客户端启用请求GZip压缩时,会产生SOAP解析错误,如果服务端启动了GZip压缩功能,客户端是否启用GZip都没有影响。