3

私はまだSpringIntegrationに苦労しています-これが私のシナリオです:

  1. WebサービスがクライアントAからリクエストを受け取ります
  2. Webサービスはリクエストをキューに入れます
  3. キューコンシューマーはメッセージFIFOを処理し、Webサービスにルーティングされる応答を送信します
  4. WebサービスはクライアントAに応答を送り返します

メッセージをすべてこのキューにフィードする複数のWebサービスがあり、それらが受信された順序で本当に処理されることを確認する必要があります。

スプリングインテグレーションのどの部分を一緒に配線する必要がありますか?

4

5 に答える 5

2

QueueChannelの Javadoc に基づいて、ここに私の試みがあります。これは、Web サービスの構成には対応せず、Web サービスのバックエンド実装に含まれるコードのみを扱います。

これは、キュー (Web サービス) に何かを追加するコードです。

public class TheWebService {

  // Could also use QueueChannel, or PollableChannel here instead
  // just picked the most general one
  private org.springframework.integration.channel.MessageChannel queue;

  public void yourWebServiceMethod(SomeArg arg) {
     SomeObjectToPassThatExtendsMessage passed = someInitialProcessing(arg);
     queue.send(passed);
  }
}

これは、レシーバー/プロセッサー/デキュー クラスに入るコードです。

public class TheProcessor {

  // Could also use QueueChannel here instead
  // just picked the most general one
  private org.springframework.integration.channel.PollableChannel queue;

  // This method needs to be setup to be called by a separate thread.
  // See http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/scheduling/package-summary.html
  // and it's sub-packages.
  public void someProcessingPoller() {
     SomeObjectToPassThatExtendsMessage passed = queue.receive();
     // Do some processing with the passed object.
  }

}

このためのSpring構成は次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">

  <bean id="webService" class="mypackage.TheWebService">
      <property name="queue" ref="queue" />
  </bean>

  <bean id="processor" class="mypackage.TheProcessor ">
      <property name="queue" ref="queue" />
  </bean>

  <bean id="queue" class="org.springframework.integration.channel.QueueChannel"/>
</beans>
于 2009-04-29T21:23:22.603 に答える
1

Spring Integrationについては注意してください。ただし、Java5にはFIFOを処理できるBlockingQueueがいくつかあります。

于 2009-04-25T18:08:14.213 に答える
1

Spring Integration の http (REST の場合) または ws (POX/SOAP の場合) の「inbound-gateway」要素を確認する必要があります。どちらも、「request-channel」属性を介して共有の Queue-backed チャネルに接続できます (同じゲートウェイを介した返信のルーティングは、バックグラウンドで処理できます)。サンプルを参照することから始めることをお勧めします。このブログは、起動して実行するのに役立ちます: http://blog.springsource.com/2010/09/29/new-spring-integration-samples/

それが役立つことを願っています。-マーク

于 2010-11-30T15:17:05.193 に答える
0

問題は春ではありません。リクエストを含み、レスポンスを提供する要素を含むキューが必要になると思います。ただし、要素がデキューされて処理されるまで、応答をブロックする必要があります。したがって、キュー要素は次のようになります。

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エンドポイントの定義の詳細については、スプリングチュートリアルを参照してください。

消費者はバックグラウンドタスクである必要があるので、私はクォーツを好みます。春の統合については、ここを参照してください。

于 2009-04-28T16:07:31.793 に答える