Java Web服务客户端中的连接详细信息和超时

我必须为给定的WSDL文件实现webservice客户端。 我使用SDK的’wsimport’工具从WSDL创建Java类,以及将webservice唯一的方法( enhanceAddress(auth, param, address) )包装成一个简单的java方法的类。 到现在为止还挺好。 Web服务function正常,返回结果正确。 代码如下所示:

 try { EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress); //Where the Port^ is the HTTP Soap 1.2 Endpoint }catch (Throwable e) { throw new AddressValidationException("Error during uniserv webservice request.", e); } 

问题现在:我需要获取有关连接的信息以及为了填充各种JMX值而可能发生的任何错误(例如COUNT_READ_TIMEOUT,COUNT_CONNECT_TIMEOUT,…)不幸的是,该方法没有正式抛出任何exception,所以按顺序要获取有关ConnectException的详细信息,我需要在将抛出的ClientTransportException上使用getCause()

更糟糕的是:我试图测试读取超时值,但没有。 我在wsdl文件中更改了服务的位置,将请求发布到php脚本,该脚本只是永远等待而不返回。 猜猜看:网络服务客户端不会超时但也会永远等待(我等了30多分钟后才杀了应用程序)。 这不是我的应用程序的一个选项,因为如果其中一些被“卡住”,我最终会用完tcp连接。

enhanceAddress(auth, param, address)方法未实现,但使用javax.jws注释。*注释,这意味着我无法查看/更改/检查实际执行的代码。

我有什么选择,但扔掉整个wsimport / javax.jsw-stuff并实现我自己的soap客户端?

要设置读取超时和连接超时,您可以在设置服务和端口实例时配置绑定参数:


  Service = new Service(); Port = Service.getPort(); ((BindingProvider) Port).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/service"); ((BindingProvider) Port).getRequestContext().put( BindingProviderProperties.CONNECT_TIMEOUT, 30); ((BindingProvider) Port).getRequestContext().put( BindingProviderProperties.REQUEST_TIMEOUT, 30); 

现在,无论何时通过“端口”执行服务,如果后端响应缓慢,您将获得响应超时和/或连接超时。 值遵循套接字类的超时值。

当超过这些超时时,您将获得超时执行或连接exception,并且您可以使用计数器代码来跟踪您获得的数量。