繁体   English   中英

客户端spring-ws连接池是否可能?

[英]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的当前评论如下:

  • 我们的应用程序没有经常关闭TCP连接。
  • 我们的应用程序(保持活动吗?)连接不允许IHS负载平衡器释放由我们的应用程序启动的原始请求启动的连接。

任何改进的建议表示赞赏。

如果我们看一下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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM