6

現在、アプリケーションサーバーのようなフレームワークにJMSサポートを追加しています。JMSはHornetQ(スタンドアロンブローカー、サーバークラスパス上のhornetq jar)によって実装されますが、JBossもSpringも、MDBを提供するものもありません。

次のステップは、着信メッセージの並列処理を可能にするメッセージリスナーをxaキューに追加することです。一部のメッセージは長時間実行されるタスクを開始するため、基本的な考え方はonMessageメソッドからワーカースレッドを生成することです。

インターネットを介した長い旅の中で、参加者の1人がこのディスカッションに出くわしました。彼はそれを行わず、タスクに追加の内部キューを使用します。(シングルスレッドの)メッセージリスナーは、インバウンドキューを作成し、内部キューの新しいメッセージを作成します。内部キューのもう一方の端では、一部のワーカースレッドが着信メッセージを求めて戦います。インバウンドメッセージは、内部キューに「コピー」されると確認応答されます(これは私にとっては問題ありません)。

残念ながら、彼らは、メソッドからワーカースレッドを生成しない方がよい理由onMessageを述べていません。おそらく、プールからのすべてのスレッドがビジーの場合、リスナーがブロックするためです。だから私はデザインの決定のための賛否両論を探しています:

  • メッセージリスナーのonMessageメソッドからワーカースレッドを開始します
  • 内部キューを使用して「ワーカースレッドにメッセージを送信」する
4

1 に答える 1

3

トランザクションの制限はさておき、キューから複数のスレッド(またはプロセス)を読み取るかどうかは、メッセージの順序が重要かどうかにかかっています。明らかに、順序が重要である場合、単一のスレッドがその順序を自然に維持しますが、複数のスレッドはそのような保証を提供しません。

通常、その順序は重要ですが、すべてのメッセージのサブセット全体で見られます。このシナリオでは、単一のスレッドのパフォーマンスが低い場合、順序を維持するために最初から単一のスレッドの読み取りを使用する必要があるため、これらのメッセージをキューから取り出し、可能な限り短い時間で再キューイングする必要がありますキュー-したがって、1つ以上の内部キューを使用します。これが発生する問題は、メッセージが完全に処理される前にトランザクションが閉じられることです。そのため、処理が行われる前にプロセスがフォールオーバーした場合にメッセージがドロップされないように、何らかの一時ストレージが必要です。

あなたの質問が示唆しているように、あなたがメッセージを落とすことについてあまり心配していないなら、あなたがjava.util.concurrent.BlockingQueueそれぞれにサービスを提供する単一のスレッドを持つ内部キューに必要なもののように聞こえます。

于 2012-12-18T18:07:40.237 に答える