Spring WS和MultiThreadedHttpConnectionManager

时间:2012-10-23 22:12:43

标签: java multithreading spring tomcat7 httpconnection

我在Spring WS 2.1.0上有一个Web服务。 Web服务在Tomcat 7上运行,并使用一种事务方法实现端点,该方法从数据库读取数据并生成不同的报告。 Tomcat 7通过JServ协议在Apache Server后面运行。

在通过Apache JMeter进行压力测试期间,我得出结论,同时处理请求是串行处理的。起初我试图调整数据库连接池(commons-dbcp和更高版本的tomcat-jdbc),但结果是一样的。端点方法只读取数据,因此没有读后读或写后读依赖,并且可以并行处理事务。因此问题在于HTTP连接处理。

经过一些搜索(当然还有谷歌搜索),我发现Spring WS附带了单线程的默认连接管理器(SimpleHttpConnectionManager)。好的做法是用MultiThreadedHttpConnectionManager替换SimpleHttpConnectionManager。我找到了如下所示的示例代码:

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg>
        <bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager>
            <property name="maxConnectionsPerHost" value="20"/>
            <property name="maxTotalConnections" value="100"/>
        </bean>
    </constructor-arg>
</bean>

但是这个例子对我来说并不是很清楚,因为我不明白Spring如何使用HttpClient(指ID或自动装配它)。那我怎么能在我的案例中使用MultiThreadedHttpConnectionManager和Spring?我应该在哪里注入此类的已配置实例?

1 个答案:

答案 0 :(得分:5)

您误解了HttpClient的用法。它仅在Spring WS 客户端模块中用于启动HTTP连接,请参阅6.2.1.1.1. HTTP transports

  

WebServiceMessageSender接口有两种实现方式,用于通过HTTP发送消息。 [...]替代方案是CommonsHttpMessageSender,它使用Jakarta Commons HttpClient。

在服务器端使用Spring WS时,根本不需要

HttpClient。在这种情况下,它是提供HTTP(服务器)抽象的servlet容器。查看您的Tomcat配置,可能是线程池太小而某些请求已排队? HttpClient绝对无关。对不起,你必须在其他地方寻找问题。


为了保持答案的完整性,当您使用Spring WS访问其他计算机上的SOAP服务时,HttpClient的以下设置适用:

  • maxConnectionsPerHost - 允许多少并发连接HttpClient保留在同一主机上(请参阅:Keep-Alive标头)?大多数浏览器将同一主机的并发连接数限制为2/4/8。 HttpClient遵循该行为,因此原则上您不能有超过2/4/8(无论您在此处设置)与同一主机的并发连接。

  • maxTotalConnections - 如上所述,但总计为所有主机。如果要连接到不同服务器上的数百种不同的Web服务,这是HttpClient可以保留的打开连接总数