2

トピックでは達成できないすべての機能がキューにありますか?

4

1 に答える 1

1

私が遭遇する主な要件は、消費者がトピックに関する単一のメッセージをめぐって競争できないことです。たとえば、コールセンターのイベントを公開するクライアントがいます。いくつかのシステムがこれらのイベントをサブスクライブします。これらのシステムの1つは、複数のインスタンスが実行されている実際のコールルーティングアプリケーションです。各インスタンスがサブスクライブする場合、呼び出しはそれらすべてにルーティングされます。ただし、メッセージがキューにドロップされ、すべてのインスタンスが同じキューを消費する場合、メッセージを受信するのは1つだけであり、呼び出しはそのオペレーターに送信されます。パブリッシングアプリケーションがトピックからキューに変換する場合、コールセンターは機能しますが、他のすべてのサブスクライバーアプリはメッセージを受け取りません。

解決策(WebSphere MQに実装されている)は、トピックに関する管理サブスクリプションを作成し、すべてのアプリケーション・インスタンスが消費するキューにメッセージを配信することでした。したがって、プロデューサーアプリは引き続きパブリッシャーであり、すべての動的サブスクライバーは引き続きメッセージのコピーを取得し、コールセンターアプリインスタンスは、公開された各メッセージの単一インスタンスをめぐって競合します。

また、キューでは使用できるのに対し、トピックでは参照セマンティクスを使用できません。トピックを使用すると、返されるメッセージをフィルタリングするセレクターを指定できますが、それだけです。キューを使用すると、参照したり、参照ポインタをリセットしたり、さらに参照したりできます。

メッセージをキューに入れ、それを受信するものが何もない場合、メッセージはキューに入れられたままになります。トピックにメッセージを送信し、アクティブなサブスクライバーまたは永続的なサブスクリプションがない場合、メッセージは破棄されます。したがって、キュー内のメッセージは当然のことながら耐久性がありますが、トピックに関するメッセージは耐久性がある場合とそうでない場合があります。

純粋なJMSの観点からは、キューとトピックはどちらも宛先のインスタンスであり、参照しない場合は交換可能です。アプリケーションは、実行時にinstanceOf()を使用して検出しない限り、開く宛先がキューであるかトピックであるかを認識できない場合があります。

于 2010-08-11T17:27:34.763 に答える