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

11

我需要实现一个访问给定WSDL文件的Web服务客户端。 我使用SDK的“wsimport”工具从WSDL创建了Java类,以及一个包装Web服务唯一方法(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的详细信息,我需要在抛出的ClientTransportException上使用getCause()。
更糟糕的是:我尝试测试读取超时值,但没有这样的选项。我在wsdl文件中更改了服务位置,将请求发送到一个简单地永远等待而不返回的php脚本。你猜怎么着:网络服务客户端不会超时,也会一直等待(我在等待30多分钟后终止了应用程序)。如果其中一些连接“卡住”,我最终会耗尽TCP连接,这对我的应用程序来说不是一个选择。
enhanceAddress(auth、param、address)方法未实现,但用javax.jws.*注释进行了标注,这意味着我无法查看/更改/检查实际执行的代码。
除了放弃整个wsimport/javax.jsw-stuff并实现自己的soap客户端外,我还有其他选择吗?
1个回答

15

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


    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);
现在,每当您通过“端口”执行服务时,如果后端响应速度慢,您将收到响应超时和/或连接超时。这些值遵循Socket类的超时值。当超时时间超过时,您将获得超时异常或连接异常,并且您可以编写计数器代码来跟踪您收到了多少个异常。

自从两周前我遇到了这个问题,我就写了自己的客户端。尽管如此,我测试了你的方法,它很有效!当时我找到了一段类似的代码,但不知怎么的,在我试图将其转换为BindingProvider时,它给了我一个ClassCastException。 - f1sh
我有一个类似的问题,但是当我获取端口时超时发生了,我该怎么解决? - maugch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接