请求完成后,WebServiceTemplate池仍关闭连接

时间:2020-05-13 20:27:42

标签: java spring-boot connection-pooling webservicetemplate

我有一个使用WebServiceTempate进行交谈以将请求发送到SOAP服务的应用程序。我(相信我已经)实现了一个连接池:

    public DefaultHttpClient createPooling() {
        PoolingClientConnectionManager connMan = new PoolingClientConnectionManager();
        connMan.setDefaultMaxPerRoute(6);
        connMan.setMaxTotal(10);
        connMan.closeIdleConnections(120000, TimeUnit.MILLISECONDS);

        DefaultHttpClient defaultClient = new DefaultHttpClient(connMan);
        defaultClient.addRequestInterceptor(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor(), 0);
        return defaultClient;
    }
    @Bean
    HttpComponentsMessageSender httpComponentsMessageSender() {
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(createPooling());
        httpComponentsMessageSender.setMaxTotalConnections(1);
        httpComponentsMessageSender.setConnectionTimeout(connectionTimeout);
        httpComponentsMessageSender.setReadTimeout(responseTimeout);
        return httpComponentsMessageSender;
    }

每个呼叫都通过marshalSendAndReceive发送。

根据documentation,我知道:

此模板使用以下算法进行发送和接收。

  1. 调用createConnection()。

  2. 在注册的消息工厂上调用createWebServiceMessage()以创建请求消息。

  3. 在请求回调上调用doWithMessage()(如果有)。此步骤基于源,编组等将内容存储在请求消息中。

  4. 在已注册的拦截器上调用handleRequest()。拦截器按顺序执行。如果任何拦截器在消息上下文中创建了响应消息,请跳至步骤7。

  5. 在连接上调用send()。

  6. 调用hasError()以检查连接是否有错误。对于HTTP传输,状态代码不是2xx表示错误。但是,由于状态码500也可以指示SOAP错误,因此模板会验证错误是否不是错误。

    • 如果连接有错误,请调用handleError()方法,该方法默认情况下会引发WebServiceTransportException。
    • 如果连接没有错误,请继续下一步。
  7. 在连接上调用接收以读取响应消息(如果有)。

    • 如果未收到响应,则返回null或false
    • 调用hasFault()以确定响应是否有故障。如果有,请调用ClientInterceptor.handleFault(MessageContext)和handleFault()方法。
    • 否则,请在响应提取器上调用ClientInterceptor.handleResponse(MessageContext)和extractData(),或在响应回调上调用doWithMessage。
  8. 调用以关闭连接。

如何跳过第8步?或者更确切地说,有没有办法让我随意关闭连接?

如果您需要更多详细信息,请告诉我。

感谢您提供的任何帮助!

0 个答案:

没有答案