[英]Is client side spring-ws connection pooling possible?
下面是来自spring-ws
SOAP调用
<bean id="OrderSubmitWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="marshaller" ref="serviceMarshaller"></property>
<property name="unmarshaller" ref="serviceMarshaller"></property>
<property name="defaultUri" value="${eoe.SubmitOrderWebService.url}" />
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="connectionTimeout" value="${eoe.SubmitOrderWebService.connectionTimeout}" />
<property name="readTimeout" value="${eoe.SubmitOrderWebService.readTimeout}" />
</bean>
</property>
</bean>
来自WebService-Hosting的评论是:您正在将多个单独的请求分组到单个TCP连接中的单个HTTP连接中。 他们还说,我们正在发送一个负载均衡器cookie,它将流量集中在一台Web服务器上(这可能是由于一些原因造成的,但这很可能是因为您将这些连接保持了很长时间)。 总体效果是降低了我们平衡负载的能力。
WS-Host的建议是:要么每个TCP连接仅发送一个WS请求,要么定期断开连接。 他们建议某处可能存在“保持活动超时”或“每个连接最大请求数”设置。
我尝试添加以下两行,但是我不相信这是解决问题的方法-因为eoe.SubmitOrderWebService.url应该是他们的负载平衡器URL。
<property name="maxConnectionsPerHost"><map><entry key="${eoe.SubmitOrderWebService.url}" value="20" /></map></property>
<property name="maxTotalConnections" value="100"/>
我们正在使用Tomcat -6.0.39, JDK -1.6, spring-ws-core :2.1.2.RELEASE
2015年1月21日更新 :我使用的是旧版本的spring-ws 2.1.2.Release,因此版本如下-已将其更改为2.1.4.RELEASE ...谢谢@ArtemBilan
基于以上内容, PoolingConnectionManager
在每个路由的总数上维护最大连接数限制。 默认情况下,此实现将为每个给定路由创建不超过2个并发连接,并且总共不超过20个连接。
2015年1月1日更新 :我们被告知上述更改没有任何重大改善。
我们的4台服务器向其负载均衡器提交每个服务器大约25%的请求,但其服务器处理在第一台服务器上为11k,在第二台服务器上为4k,其余3台服务器处理的其余几百台服务器,其示意图如下所示:
____ Server 1 - processed 11,000 requests
Our server 1 (sent 4k)---\ |Their WS| /___ Their Server 2 - processed 4,000
Our server 2 (sent 4k)--- \______|Load |_____/____ Server 3 - processed 100 requests
Our server 3 (sent 4k)----/ |Balancer| \____ Server 4 - processed 400 requests
Our server 4 (sent 4k)---/ |URL | \___ Server 5 - processed 500 requests
WS-Host的当前评论如下:
任何改进的建议表示赞赏。
如果我们看一下HttpComponentsMessageSender
源代码,将会看到它默认情况下是池化的:
/**
* Create a new instance of the {@code HttpClientMessageSender} with a default {@link HttpClient} that uses a
* default {@link PoolingClientConnectionManager}.
*/
public HttpComponentsMessageSender() {
DefaultHttpClient defaultClient = new DefaultHttpClient(new PoolingClientConnectionManager());
defaultClient.addRequestInterceptor(new RemoveSoapHeadersInterceptor(), 0);
......
因此,这是对您的问题的有力答案:不仅可能,而且默认情况下也是这样。
但是,只有在使用Commons HTTP时才能使用。 对于标准的Java HttpURLConnection
我们没有这样的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.