我必须为给定的WSDL文件实现webservice客户端。
我使用SDK的'wsimport'工具从WSDL创建Java类,以及将webservice唯一的方法(enhanceAddress(auth, param, address)
)包装成一个简单的java方法的类。到现在为止还挺好。 Web服务功能正常,返回结果正确。代码如下所示:
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,...)的错误信息
不幸的是,该方法没有正式抛出任何异常,因此为了获得有关ConnectException的详细信息,我需要在将引发的getCause()
上使用ClientTransportException
。
更糟糕的是:我试图测试读取超时值,但没有。我在wsdl文件中更改了服务的位置,将请求发布到php脚本,该脚本只是永远等待并且不会返回。猜猜是什么:Web服务客户端不超时但是也一直等待(我在等待30分钟后杀死了应用程序)。这不是我的应用程序的一个选项,因为如果其中一些被“卡住”,我最终会用完tcp连接。
enhanceAddress(auth, param, address)
方法未实现,但使用javax.jws注释。*注释,意味着我无法查看/更改/检查实际执行的代码。
我有什么选择,但要扔掉整个wsimport / javax.jsw-stuff并实现我自己的肥皂客户端吗?
答案 0 :(得分:14)
设置读取超时和连接超时,您可以在设置服务和端口实例时配置绑定参数:
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);
现在,无论何时通过“端口”执行服务,如果后端响应缓慢,您将获得响应超时和/或连接超时。值遵循套接字类的超时值。
当超出这些超时时,您将获得超时执行或连接异常,并且您可以使用计数器代码来跟踪您获得的数量。