代码之家  ›  专栏  ›  技术社区  ›  f1sh

Java Web服务客户端中的连接细节和超时

  •  10
  • f1sh  · 技术社区  · 15 年前

    我必须对给定的WSDL文件实现一个WebService客户机。 我使用SDK的“WSIMPART”工具从WSDL创建Java类,也使用了包的WebService唯一方法的类( enhanceAddress(auth, param, address) 成为一个简单的Java方法。到目前为止,一切都很好。WebService功能正常,并正确返回结果。代码如下:

    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连接中的一些被“卡住”,我最终会用完这些连接。

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

    除了扔掉整个wsimport/javax.jsw-stuff并实现自己的SOAP客户机,我还有其他选择吗?

    1 回复  |  直到 15 年前
        1
  •  14
  •   Helter Scelter    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类的超时值。

    当超过这些超时时,您将获得超时执行或连接异常,您可以放置计数器代码来跟踪您获得的数量。