MDBを使って非同期通信を確認
送信側の起動
Javaアプリケーションを実行するには、GlassFishが提供するappclientを使用します。詳しくは前編を参照ください。図5のようにコマンドプロンプトでappclientを使用して受信側を起動します。非同期であるため、受信側が起動していることは気にしなくて構いません。コマンド発行後の画面が図6です。コンソールには何も出力していないためそのまま終了しています。この後受信側にメッセージを届けるのはキューの役割です。
受信側の起動
MDBを起動するにはNetBeansの左ペインから[プロジェクト]タブを開き[MDBSample01-ejb]を右クリックして、[実行]を選択します。すると、GlassFish上でImoshochuMessageDrivenBeanがメッセージを待つ状態になります。この場合、既に送信側からメッセージがキューに送られているため、すぐにメッセージを受信します。
GlassFish v2.1のコンソールに受信状態を出力するようにしているため図7のように送信側から送られたオブジェクトの内容が表示されます。前編同様、まずは受信側を起動し、その後送信側を起動するとどうなるか確認してください。
紛らわしいこと
前編、後編ともキューを使った非同期通信を説明しましたが、前編ではreceiveメソッドを使い、後編ではonMessageメソッドを使用しました。
実はJMSのメッセージ受信には同期受信と非同期受信があります。receiveメソッドを使用したメッセージ受信を同期受信と呼び、onMessageメソッドを使用したメッセージ受信を非同期受信と呼びます。
今まで説明してきたように、メッセージを取りに行くのを同期受信、メッセージが配信されるのを待つのが非同期受信です。JMSという大きな枠組みで見ればJMS自体は非同期通信です。受信というJMS内部では同期と非同期が存在すると考えてもらえれば分かりやすいと思います。
最初に説明すべきことですが、筆者自身これらの言葉の使い分けで混乱した経験から、2つの受信の仕方を説明したのちにこれらの区別を説明した次第です。
問いかけ
JMSは仕様が固まってから10年弱が経とうとしています。しかし、成熟しているからこそバージョンが上がっていないだけの話です。ソフトウェアアーキテクトの方が読まれていたらJMSが古いと言うだけでアーキテクチャから排除されているでしょか? おそらく、臨機応変に使用されていることと思います。Webサービスは知っているがJMSを知らないソフトウェアアーキテクトが増えていることを鑑みて、あえてJMSを題材として取り上げてみました。
サンプルコード
図8が今回のプロジェクトのフォルダ構成です。複数のプロジェクトが存在し分かりづらいかと思いますが、記事に沿って構築していただければと思います。
読者の方からはjarファイル、warファイル、earファイルだけをくれればいいという指摘を受けますが、あえてJavaのソースコードのみをサンプルコードとして提供いたします。それはJavaのソースコードのみではアプリケーションを構築することは不可能であり、構築する過程において多くのことを学んでほしいからとの思いもあります。
サンプルコードはページトップにあるので、ぜひダウンロードしてご利用ください。