このパターンをJMSで実装する最良の方法は、あらかじめ設定されたレスポンスメッセージのトピックを作成し、レスポンスメッセージに相関セレクタを使用してクライアントが正しいもの。
詳細には、要求メッセージにランダムIDを設定し(setJMSCorrelationID()
を使用)、そのメッセージを要求キューに入れることを意味します。その要求メッセージの消費者はそれを処理し、応答メッセージを作成し、応答メッセージに同じ相関IDを設定し、それを応答トピックに置きます。一方、クライアントは、応答トピックで、それが予期している相関IDを指定するセレクター式でリッスンしています。
クライアントがリスニングする前に応答メッセージが送信される危険性がありますが、それはおそらくありません。トピックではなくレスポンスにあらかじめ設定されたキューを使用してみることができますが、トピックがより確実に機能する傾向があることがわかりました(選択したJMSプロバイダはHornetQです。
これはすべて、JMSが要求/応答モデルに適していないことを示しています。 APIはそれを正しくサポートしていません。 JMSのユースケースではなかったので、これは驚くことではありません。
計算格子(Terracotta、Gigaspaces、Infinispanなど)のようなものは、より良い結果をもたらす可能性がありますが、それは実際にはあなたの選択肢ではありません。
これは、あなたが使用しているテクノロジに大きく依存すると思います(言及していない)。 – skaffman
私は、JMSと互換性があり、具体的なメッセージング実装には無関係なソリューションを求めています。私はActiveMQを使用していると言えるかもしれませんが、私のアプリケーションをActiveMQでのみ可能なものに依存させたくありません。 –
@ DR:ストンププロトコルは、とにかくActiveMQにあなたをロックしますね。 「本当の」エンタープライズJMSプロバイダのどれもそれを使用しません。 – skaffman