1

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

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

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

<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 一起使用?我应该在哪里注入这个类的配置实例?

4

1 回答 1

5

您误解了HttpClient. 仅在 Spring WS客户端模块中用于发起 HTTP 连接,见6.2.1.1.1。HTTP 传输

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

HttpClient在服务器端使用 Spring WS 时根本不需要。在这种情况下,它是提供 HTTP(服务器)抽象的 servlet 容器。看看你的Tomcat配置,可能是线程池太小,有些请求排队了?HttpClient在这里绝对没有什么可做的。很抱歉,您必须在其他地方寻找问题。


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

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

  • maxTotalConnections- 像上面一样,但对所有主机都是如此。HttpClient如果您要连接到不同服务器上的数百个不同 Web 服务,这是可以保持的打开连接总数

于 2012-10-24T17:50:32.557 回答