サンプル 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.
を呼び出し、次にメッセージ、送信モード、優先順位、および有効期限を指定して
setTextQueueSender.send
を呼び出します。
/sample6a/client/Receiver.java
ファイルを開いて、メッセージを取得する方法について調べます。Receiver
は、次の表が示すとおり 3 つの引数を受け入れます。
Receiver
も QueueConnectionFactory
に対する参照を取得し、その参照を使用して 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
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
に送信されません。メッセージが生成されたときに Receiver
が listener
として登録されていなかったためです。