1

Spring WS 2.1.0 で Web サービスを使用しています。Web サービスは Tomcat 7 で実行され、データベースからデータを読み取り、さまざまなレポートを生成する 1 つのトランザクション メソッドを持つエンドポイントを実装します。Tomcat 7 は、JServ プロトコルを介して Apache サーバーの背後で実行されます。

Apache JMeter を介したストレス テスト中に、同時リクエストは連続して処理されるという結論に達しました。最初に、データベース接続プール (commons-dbcp 以降の tomcat-jdbc) を調整しようとしましたが、結果は同じでした。エンドポイント メソッドはデータの読み取りのみを行うため、書き込み後の読み取りまたは読み取り後の書き込みの依存関係はなく、トランザクションは並列で処理できます。したがって、問題は 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 を参照するか、それを自動配線するか) を理解していないため、この例は私にはあまり明確ではありません。では、私の場合、Spring で MultiThreadedHttpConnectionManager を使用するにはどうすればよいでしょうか? このクラスの構成済みインスタンスをどこに注入すればよいですか?

4

1 に答える 1

5

You are misunderstanding the usage of HttpClient. It's only used in Spring WS client module to initiate HTTP connections, see 6.2.1.1.1. HTTP transports:

There are two implementations of the WebServiceMessageSender interface for sending messages via HTTP. [...] The alternative is the CommonsHttpMessageSender, which uses the Jakarta Commons HttpClient.

HttpClient is not needed at all when Spring WS is used on the server side. In that case it's the servlet container that provides HTTP (server) abstraction. Check out your Tomcat configuration, maybe the thread pool is too small and some requests are queued? HttpClient has absolutely nothing to do here. I'm sorry, but you'll have to look for a problem somewhere else.


Just to keep the answer complete, when you use Spring WS to access SOAP services on other computer, the following settings of HttpClient apply:

  • maxConnectionsPerHost - how many concurrent connections HttpClient is allowed to keep to the same host (see: Keep-Alive header)? Most browsers limit the number of concurrent connections to the same host to 2/4/8. HttpClient follows that behaviour, so in principle you cannot have more then 2/4/8 (whatever you set here) concurrent connections to the same host.

  • maxTotalConnections - like above, but total to all hosts. If you are connecting to hundreds of different web services on different servers, this is the total number of open connections HttpClient can keep

于 2012-10-24T17:50:32.557 に答える