サンプル 6b:パブリッシュ、サブスクライブ

サンプル 6b では、パブリッシュ/サブスクライブ (トピックベース) のメッセージ サポートを使用します。トピックを使用すると、登録されているすべての Subscribers (サブスクライバ) は、期限切れでないメッセージを受信します。サンプル 6a で説明した接頭辞と同じ接頭辞を使用して、メッセージの優先順位や持続性を指定できます。

/sample6b/client/Publisher.java ファイルの run メソッドを調べて、サンプルがトピックにメッセージを発行したときの publish メソッドの使用方法を理解します。
/sample6b/client/Subscriber.java ファイルの onMessage メソッドを調べて、サンプルが受信メッセージを表示する方法を理解します。

サンプルを実行するには、次のコマンドを入力してサーバを起動してください。「No bean found in jar(s)」というメッセージは無視します。

bash$ make jars 
bash$ make deploy
bash$ make standalone

Publisher (パブリッシャ) がメッセージの送信を始める前にリスナとして登録できるように、ここでいくつかの Subscribers を起動する必要があります。登録されたリスナは、トピックに対して新しいメッセージだけを受信します。トピックにすでに含まれているメッセージは、新しく登録されたリスナには送信されません。

新しいシェルを開き、複数の Subscribers に対して次のコマンドを入力します。

bash$ make subscriber host=localhost topic=dog mode=auto

次に新しいシェルを開き、次のコマンドを入力して Publisher を開始します。

bash$ make publisher host=localhost topic=dog name=spot

メッセージを送信すると、Subscribers によって自動的にメッセージが受信されます。オートモードの場合、Subscribers はサブスクライバがアクティブなときに発行されたメッセージだけを受信します。

Subscriber をマニュアル モードで起動した場合は、メッセージ バッファに現在入っている任意のメッセージを取得できます。バッファ サイズを指定するには、
jms.messageCapacity プロパティを設定します。

トピックを階層型にすることができます。その様子が /sample6b/ejbeans/TopicBean.
java
ファイルに示されています。ejbFindSuperTopics メソッドは、同じ接頭辞を持つほかのトピックを検索します。たとえば、dog というトピックと dog.lab というトピックがある場合、dog は上位トピック、dog.lab はサブトピックになります。そのため、dog のサブスクライバは dog.lab メッセージを受信しますが、dog.lab のサブスクライバは dog.lab メッセージだけを受信します。ただし、dog.lab のサブスクライバは、dog.lab.black のメッセージを受信します。TopicBean.java は、実際の環境のトピック規則に合わせて簡単にカスタマイズできます。