我必须为给定的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的详细信息,我需要在将要抛出的getCause()上使用ClientTransportException

更糟糕的是:我尝试测试读取超时值,但是没有。我更改了wsdl文件中服务的位置,以将请求发布到仅等待永远且不会返回的php脚本中。猜猜是什么:Web服务客户端不会超时,但也会永远等待(在等待30分钟以上后,我杀死了该应用程序)。这不是我的应用程序的选择,因为如果其中某些连接被“卡住”,我最终会耗尽tcp连接。
enhanceAddress(auth, param, address)方法未实现,但使用javax.jws。*进行了注释。这意味着我无法查看/更改/检查实际执行的代码。

除了扔掉整个wsimport/javax.jsw-stuff并实现自己的soap客户端之外,我是否有其他选择?

最佳答案

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

    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类的超时值。

当超过这些超时时,您将收到超时异常或连接异常,并且可以放入计数器代码来跟踪获得的计数。

10-05 23:08
查看更多