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

时间:2015-01-19 22:30:00

标签: web-services soap soap-client spring-ws

我们正在从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年4月1日更新:我们被告知上述变更未有任何重大改进。

我们的4台服务器向其负载均衡器提交了大约25%的服务器请求,但是他们的服务器处理在第一台服务器上是11k,在第二台服务器上是4k,其余3台服务器处理的是少数100台,如下图所示:

                                                  ____ 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负载均衡器释放由我们的应用程序启动的原始请求启动的连接。

任何改善建议都值得赞赏..

1 个答案:

答案 0 :(得分:4)

如果我们查看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,我们没有这样的选择。