2

次のようなワークフローが必要です。

                                         / 労働者 1 \
=リクエスト チャネル= -> [保留キュー|||] -> ワーカー 2 -> =応答チャネル=
                                         \労働者3/

あれは:

  • リクエストが到着し、FIFO キューに入る
  • 次に、同一のワーカーがキューからタスクを取得します
  • 任意の時点で、ワーカーは 1 つのタスクのみを実行できます
  • ワーカーが空いていて保留キューが空でない場合、ワーカーはすぐに別のタスクを取得する必要があります
  • タスクが完了すると、ワーカーは結果をResponse Channel

QueueChannelSpring Integration に があることは知っていますが、これらのチャネルにはポーリングが必要です (これは最適ではないようです)。特に、ワ​​ーカーが忙しくできるのであれば、ワーカーには忙しくしてもらいたいです。

また、キューを完全に回避し、単純にタスクをすべてのワーカーにラウンドロビンさせることも検討しましたが、一部のタスクは他のタスクよりも速く完了する可能性があるため、待機列を 1 つにすることをお勧めします。さらに、残りのジョブ数 (キューから取得できる) と、すべてまたは特定のジョブをキャンセルする機能についての洞察が必要です。

ポーリングを回避しながら、このメッセージ キューイング/作業分散パターンを実装するにはどうすればよいですか?

編集: Message Dispatcher パターンを探しているようです-Spring/Spring Integration を使用してこれを実装するにはどうすればよいですか?

4

2 に答える 2

3

Spring Integration 2.0.0 では、<dispatcher/>要素にサブ要素を追加しました<channel/>。これを使用して、ポーラーを使用せずに非同期ハンドオフを保証できます。

これは下で java.util.concurrent を使用します。

<channel id="shareableWork">
    <dispatcher task-executor="pool"/>
</channel>
<thread-pool-task-executor id="pool" max-size="3"/>
于 2010-05-08T11:15:46.803 に答える
2

おそらく、同時実行パッケージの ExecutorService クラスを確認する必要があります。

于 2010-03-18T12:44:34.707 に答える