wsimport生成webservice客户端代码设置连接超时

一、使用wsimport生成客户端代码

wsimport -keep -s ./src/main/java -p{com.XXX} -verbose{server-url}

本文以以下参数为例

wsimport -keep -s ./src/main/java -pcom.ldt.test-verbose

http://192.168.88.27:7009/frdif/n_frdif.asmx?WSDL

通过以上代码生成客户端代码,把生成的代码按照包结构放在项目中。

以下是调用生成的客户端代码:

NFrdif.java

@WebServiceClient(name = “n_frdif”, targetNamespace = “http://tempurl.org”,

wsdlLocation = “http://192.168.88.27:7009/frdif/n_frdif.asmx?WSDL”)

public class NFrdif   extends Service{}

NFrdifSoap.java

@WebService(name = “n_frdifSoap”, targetNamespace = “http://tempurl.org”)

@XmlSeeAlso({

    ObjectFactory.class

})

public interface NFrdifSoap {}

调用生成的客户端代码。

NFrdifSoap client = new NFrdif().getNFrdifSoap();

client.processdata(xxx,xxx,xx);

二、连接数太多服务宕了

不过上线后,200个并发就宕掉了,登陆服务器后,发现连接第三方服务的连接数有几十个,而且迟迟不释放。

刚开始以为是客户端的bug,便设置了连接池,限制了最大连接数。

但在200个并发的时候,还是存在创建大量连接的问题。刚开始保持很少量的连接数,当访问变慢后,连接数持续增加,直至服务宕掉。

于是,我们假设,连接数的增加是因为某次请求长时间未响应而阻塞,并且不能及时断开连接,那么将开启新的连接。当连接大量阻塞但不能释放时,连接数被大量消耗。

为了证明这点,我们尝试通过抓包的方式来进行分析。可惜未能获取想要的头信息与报文。

三、主动断开超时连接

结合http接口调用,设置超时参数的经验。既然服务端不能及时断开阻塞的链接,可以通过客户端的超时参数,强制超时断开连接,相对比较及时的释放阻塞的链接。此方案应运而生。

但如何设置wsimport生成的客户端的代码的超时参数,并不顺利。查阅了大量资料,才发现javax.xml.ws.BindingProvider类有设置头信息的功能。

Webservice客户端调用改良如下:

NFrdifSoap client = new NFrdif().getNFrdifSoap();

#设置超时参数

BindingProvider bindingProvider = (BindingProvider)client ;

Map<String, Object> requestContext = bindingProvider.getRequestContext();

requestContext.put(

“com.sun.xml.internal.ws.connection.timeout”,

// JAXWSProperties.CONNECT_TIMEOUT,//jdk 1.8

10 * 1000);//建立连接的超时时间为10秒

requestContext.put(

“com.sun.xml.internal.ws.request.timeout”,

// JAXWSProperties.REQUEST_TIMEOUT,//jdk 1.8

15 * 1000);//指定请求的响应超时时间为15秒

client.processdata(xxx,xxx,xx);

方案改良后,接口响应慢的影响从全局缩小到了单个接口调用。并发性能有所提升,并提高了系统稳定性。但如果从全局着眼,还是要通过提升第三方服务端性能与优化接口调用方式(在保持及时性的情况下,大大减少接口调用频率)。

© 2017, 李德涛博客. 版权所有.

发表评论

电子邮件地址不会被公开。 必填项已用*标注