問題は春ではありません。リクエストを含み、レスポンスを提供する要素を含むキューが必要になると思います。ただし、要素がデキューされて処理されるまで、応答をブロックする必要があります。したがって、キュー要素は次のようになります。
public class BlockingPair {
private final RequestBodyType request;
private ResponseBodyType response;
public BlockingPair(RequestBodyType request) {
this.request = request;
}
public RequestBodyType getRequest() {
return request;
}
public ResponseBodyType getResponse() {
while (response == null) {
Thread.currentThread().sleep(10);
}
return response;
}
public void setResponse(ResponseBodyType response) {
this.response = response;
}
}
Webサービスエンキューは、リクエスト本文を使用してBlockingPairを作成します。BlockingPair要素をキューにプッシュするより。その後、BlockingPairから応答本文を取得する応答を作成しますが、ブロックします。
コンシューマーは1つのBlockingPairをデキューし、応答本体を設定します。そこから、Webサービスは応答の書き込みを続行します。
Webサービス、ブロッキングキュー、およびコンシューマーの3つのBeanが必要です。Webサービスとコンシューマーの両方がBeanプロパティとしてキューを必要とします。
キューとコンシューマーBeanは、アプリケーションコンテキストで計画する必要があります(によって初期化されますContextLoaderListener
)。キューには、Webサービスによる参照であるBean IDが必要です(独自のコンテキストがありますが、キュー参照を参照できるように、親としてのアプリケーションコンテキストがあります)。
の一部web.xml
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
にapplicationContext.xml
は2つのBeanが含まれています。
<bean id="queue" class="java.util.concurrent.LinkedBlockingQueue"/>
<bean id="consumer" class="...">
<property name="queue" ref="queue"/>
</bean>
Webサービスには独自のコンテキスト定義がありますservice-servlet.xml
。
<bean id="endpoint" class="org.springframework.ws.server.endpoint....PayloadEndpoint">
<property name="queue" ref="queue"/>
</bean>
スプリングwsエンドポイントの定義の詳細については、スプリングチュートリアルを参照してください。
消費者はバックグラウンドタスクである必要があるので、私はクォーツを好みます。春の統合については、ここを参照してください。