我有一个使用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,我知道:
此模板使用以下算法进行发送和接收。
调用createConnection()。
在注册的消息工厂上调用createWebServiceMessage()以创建请求消息。
在请求回调上调用doWithMessage()(如果有)。此步骤基于源,编组等将内容存储在请求消息中。
在已注册的拦截器上调用handleRequest()。拦截器按顺序执行。如果任何拦截器在消息上下文中创建了响应消息,请跳至步骤7。
在连接上调用send()。
调用hasError()以检查连接是否有错误。对于HTTP传输,状态代码不是2xx表示错误。但是,由于状态码500也可以指示SOAP错误,因此模板会验证错误是否不是错误。
- 如果连接有错误,请调用handleError()方法,该方法默认情况下会引发WebServiceTransportException。
- 如果连接没有错误,请继续下一步。
在连接上调用接收以读取响应消息(如果有)。
- 如果未收到响应,则返回null或false
- 调用hasFault()以确定响应是否有故障。如果有,请调用ClientInterceptor.handleFault(MessageContext)和handleFault()方法。
- 否则,请在响应提取器上调用ClientInterceptor.handleResponse(MessageContext)和extractData(),或在响应回调上调用doWithMessage。
调用以关闭连接。
如何跳过第8步?或者更确切地说,有没有办法让我随意关闭连接?
如果您需要更多详细信息,请告诉我。
感谢您提供的任何帮助!