2017-11-06 10 views
0

私が取り組むアプリケーションでは、TCPソケットからのメッセージが連続して流れています。メッセージにはさまざまな種類があります。さまざまな種類のメッセージを並行して処理する必要があります。しかし、それぞれの特定のタイプのメッセージは、入ってくる順に処理する必要があります。 私はSpring統合からExecutorChannelを使用し、並列処理の必要性を解決しました。特定の種類のメッセージごとにチャネルを作成しました。 しかし、私は特定のタイプのメッセージの順序付けられた処理を保証することはできません。Spring統合 - 並列オーダー処理

パブリッシュ/サブスクライブチャネルでオーダー処理を行う方法はありますか?並列処理も使用していますか?

答えて

1

同様のExecutorChannelを使用することを考慮しますが、各タイプの入力として考慮してください。それぞれがエグゼキュータを使って単一のスレッドで構成されるべきだというトリックです。したがって、メッセージ・タイプと同数のシングル・スレッド・エグゼキュータ・チャネルがあります。

もう1つのトリックは、のように、キューのサブスクライバとしてfixed-delayを持つポーリングエンドポイントとそれぞれのタイプです。

現在のSpring Integration 5.0がFluxMessageChannelであるため、もう1つのオプションを利用できます。順序は内部ReactorのFluxによって保証され、並列処理はサブスクライバによって実現されます。Fluxの処理メッセージはサブスクライバスレッドで発生します。

+0

ExecutorChannelはExecutorをコンストラクタパラメータとして受け入れるため、異なるメッセージタイプごとに同じスレッドで常に動作するようにするにはどうすればよいですか? maxpoolsizeが1のスレッドプールエグゼキュータを割り当てますか? –

+1

もう一度:あなたが持っている多くのメッセージタイプと同じくらい多くのシングルスレッドExecutorChannelsが必要です。 1つのエグゼキュータチャネルは、タイプ別にルーティングされるメッセージのために、シングルスレッドエグゼキュータに基づいているため、適切な順序が保証されています。 –

+1

私の答えにはもう1つの可能なオプションもあります。 –