サンプル 6a:ポイントツーポイント

サンプル 6a では、ポイントツーポイントまたはキューベースのメッセージ サービスを使用します。サンプルでは、メッセージがキューに書き込まれる同期メッセージ機能が示されます。この後、キューからメッセージがポーリングされます。また、メッセージを自動的に受信するためにリスナが登録する非同期メッセージも扱われます。

/sample6a/deploy.properties ファイルを確認することから始めます。メッセージを有効にするには、ejipt.enableMessaging プロパティを true に設定します。この設定は、メッセージ関連の Bean を読み込むように EJB エンジンに通知します。このプロパティが true に設定されていないと、メッセージ機能は働きません。

次のプロパティ設定にも注意してください。

default.MessageQueueHome.ejb.enterpriseBeanClassName=ejbeans.QueueBean

この設定は、default.MessageQueueBean ではなく ejbeans.QueueBean を使用してメッセージを持続させるように JRun に指示します。/sample6a/ejbeans/QueueBean.java ファイルを見ると、onAdding および onRemoved メソッドが実装されていることがわかります。onAdding メソッドはメッセージをキューに入れる直前に呼び出されますが、onRemoved メソッドはメッセージをキューから削除した直後に呼び出されます。この方法によって、サンプルは JRun ログ ファイルにエンティティを書き込めるようになります。ユーザ アプリケーションは、必要に応じて類似した機能を実装するために MessageQueueBean を拡張できますが、通常は必要ありません。

クライアント側アプリケーションには、Sender (送信元) と Receiver (受信側) の 2 つがあります。/sample6a/client/Sender.java ファイルを開いて Sender を確認します。Sender は、次の表が示すように 3 つの引数を受け入れます。
パラメータ
host
サーバのホスト名、あるいはサーバと Sender がローカルで稼動している場合は localhost を指定します。
queue name
メッセージの送信先のキューを識別します。
mode
Sender が一連のメッセージを自動生成するかどうかを指定します。
値は、manual または auto です。
name
送信元を識別するための名前を指定します。

Sender.java ファイルでは、Sender では最初に QueueConnectionFactory の参照を取得する必要があります。これを行うと QueueConnection を取得できます。接続が確立されると、QueueSession を作成してメッセージの送信を開始できます。さらに、Sender は、queue name パラメータを使用して実際のメッセージ キューを作成します。

実際のメッセージを生成して送信するには、Sender はテキストを指定して Message.
setText
を呼び出し、次にメッセージ、送信モード、優先順位、および有効期限を指定して QueueSender.send を呼び出します。

/sample6a/client/Receiver.java ファイルを開いて、メッセージを取得する方法について調べます。Receiver は、次の表が示すとおり 3 つの引数を受け入れます。
パラメータ
host
サーバのホスト名、あるいはサーバと Receiver がローカルで稼動している場合は localhost を指定します。
queue name
メッセージを取得する元のキューを識別します。
mode
受信側がキューからメッセージを手動で取得するか (同期)、あるいはメッセージを自動受信するために受信側をリスナとして登録するか (非同期) を指定します。
値は、manual または auto です。

ReceiverQueueConnectionFactory に対する参照を取得し、その参照を使用して QueueConnection を取得し、QueueSession を作成する必要があります。ここでは、Sender ではなく QueueReceiver が作成されます。auto モードの場合、Receiver はキューの listener として登録されます (非同期)。それ以外の場合は、Enter キーを押すたびにキューがチェックされます (同期)。

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

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

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

bash$ make sender host=localhost queue=cat mode=manual name=fluff

次のような出力が表示されます。

Type message to send or 'quit' to exit, then press <ENTER> 

任意のテキストを入力し、Enter キーを押すと、次のように表示されます。

Sending:[delivery:non-persistent, priority:default, from:fluff]
Content:<入力したテキスト>
Type message to send or 'quit' to exit, then press <ENTER>

メッセージを送信する場合に、メッセージに接頭辞 :dp を付けると、DeliveryMode が持続するように指定できます。

:dpメッセージのテキスト

この場合、サーバがシャットダウンしてもメッセージは持続します。メッセージは、instance.store を使用して QueueBean により持続されます。モードが持続しているかどうかをテストするには、メッセージを送信して、サーバを停止してから起動し、次に Receiver を起動します。Sender ではメッセージの有効期限が 5 分に設定されているため、送信する前にメッセージが期限切れになることがあります。

メッセージに接頭辞 :pX を付けることによって優先順位を設定することもできます。ここで、X は 0 〜 9 で、9 が最高の優先順位を表します。優先順位が高いメッセージは、優先順位が低いメッセージより先に送信されます。

:p9メッセージのテキスト

試しに優先順位の異なるいくつかのメッセージを送信し、連続して受信してみてください。優先順位が高い順にメッセージを受信するはずです。

mode=auto にして Sender を起動すると、一連のメッセージが自動的に生成されて送信されます。

bash$ make sender host=localhost queue=cat mode=auto name=fluff

ここで新しいシェルを開き、次のコマンドを入力して Receiver を起動します。

bash$ make receiver host=localhost queue=cat mode=manual

次のような出力が表示されます。

Press <ENTER> to receive message or enter 'quit' to exit

Enter キーを押してメッセージを取得します。

Received:[delivery:non-persistent, priority:-1, from:fluff]
Content:<your text here>
Press <ENTER> to receive message or enter 'quit' to exit

Receiver に対してコマンド ラインに「:wXXX」と入力できます。XXX は、受信側が新しいメッセージを受信するのに待機する秒数を表します。Receiver は、指定された秒数が経過するか、またはメッセージを受信するまで待機します。

mode=auto にして Receiver を起動すると、非同期メッセージを受信するのでポーリングは不要です。その場合、Receiver はキューの listener として登録されていなければなりません。Receiver をリスナとして登録した時点でキューにすでに入っているメッセージがあったとしても、それらのメッセージは Receiver に送信されません。メッセージが生成されたときに Receiverlistener として登録されていなかったためです。