CodeZine(コードジン)

特集ページ一覧

今からでも遅くない JMSを学ぼう!(後編)
Message-Driven Beanの世界へ

MDBを使いアプリどうしを非同期通信します

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/04/15 14:00

ダウンロード サンプルコード (2.9 KB)

 前回はJavaアプリケーションを使い非同期通信の世界を紹介しました。今回はWebアプリケーションにMessage-Driven Beanを組み込み、業務でも使えるようにします。

目次

Message-Driven Beanとは

 前回、JMSをJavaアプリケーションに組み込んで非同期通信を説明しました。ただし、業務ではMessage-Driven Bean(MDB)を使用する方が多いため、今回はMDBを使った非同期通信の仕方を説明します。

あらかじめ知っておくべきこと

前提知識

 「今からでも遅くない JMSを学ぼう!」ではJMSを通じて非同期通信を学ぶことを目的としていますが、ドメインはPTPを使用しているため、Pub/Subの知識は必要ありません。PTPについてご存じない方、JMSの知識のない方は前編を読んだ後にその後編の当記事を読まれることをお薦めします。

 Webアプリケーションの基礎的な知識が必要です。JSPやServlet、あるいはStrutsなどのWebフレームワークを使用した経験のある方はそのまま読むことが可能です。知識がない方は筆者の「GlassFishからアプローチするJava~入門編~」の連載や、Webアプリケーションを扱った書籍やインターネットのサイトでの学習をお薦めします。

使用するWebアプリケーションサーバおよび開発環境

 WebアプリケーションサーバはJMS製品が組み込んであるGlassFish v2.1.1を使用します。

 開発ツールはNetBeans IDE 6.7.1を使用します。実装手順などはすべてNetBeansを元に説明します。

MDBを使う理由

MDBはEJBである

 MDBとはEJBの1つです。他にはご存じのようにSession BeanEntity Beanが存在します。MDBがJava EEに正式に仕様として取り込まれたのがEJB 2.0です。それ以前はWebアプリケーションに非同期通信を導入するにはJMSのAPIを使うしかありませんでした。今ではビジネスロジック層やデータソース層をPOJOで記述することが多くなりましたが、EJBもそれなりの魅力を保っています。

 話をMDBからEJBに一旦切り替えます。筆者の経験のみの推測ですが、EJBが普及しなかった大きな原因がCMP(Container Managed Bean、Entity Beanの1つ)の難解さにあったと思っています。

 EJB 1.1ではエンティティ間の関係は1対1しか対応していませんでした。私たち技術者は1対多、多対多の関係もサポートされることを望んでいました。EJB 2.0の登場でエンティティの関係は1対多、多対多までサポートされ喜んだのですが、いざ実装となるとデプロイメントディスクリプタ(以降、DD)の記述の難解さ、EJB QLの習得の困難さに泣かされることになったのです。

 DDの難解さだけでなく、DDとCMPが非常に緊密に結びついており、CMPをコーディングできる技術者がほとんどいない状況でした。筆者自身はCMPに精通していたため、昼はプロジェクトマネージャ、夜はCMP専門のプログラマという過酷なプロジェクトを経験しました。50本以上もCMPを作成し終えた後、これは普及しないと実感した次第です(ただし、EJB 3.0では、JPAと組み合わせることで非常に簡単にRDBにマッピングできるようになりました。JPAについては近いうちに記事にできればと考えています)。

 上記のような理由からEJB自体必要ないと思われがちですが、EJBはEJBコンテナにライフサイクルの管理を委ねることができるということと、例外が発生した場合のリソースの解放やトランザクションのロールバックなどをEJBコンテナが自動的に行ってくれることなどを考えると魅力のある存在なのです。つまりEJBの魅力は陰にEJBコンテナの存在があるからなのです。

記述の容易さ

 上記の通り、MDBもEJBコンテナがライフサイクルの管理を行ってくれたり、リソースの生成、解放など自動的に行ってくれるためWebアプリケーションに非同期処理を加えたい場合には非常に重宝する存在です。コーディングもJMSのAPIを駆使する場合と比較すると非常にシンプルです。前編で説明できなかったトランザクション制御も必要最小限のコーディングで済みます。他のEJB、特にCMPと比較すると非常に楽なコーディングが可能です。

onMessageメソッドでメッセージを取得できる

 前編でJMSにはPTPとPub/Subというドメインがあることを説明しました。onMessageはPub/Subでよく使用されますが、onMessageはPub/SubだけでなくPTPでも使用することができます。何を言いたいかというと、PTPで受信側がメッセージを取得する場合、receiveメソッドを使用するとリソースを拘束することになります。したがって、一般的に業務で使用するWebアプリケーションではreceiveメソッドではなく、onMessageメソッドによりメッセージを取得します。MDBがあらかじめonMessageメソッドを持っていることもMDBを使う理由です。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

  • 川久保 智晴(カワクボ トモハル)

    haruプログラミング教室(https://haru-idea.jp/)主宰。 COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScript...

バックナンバー

連載:Java Message Service再入門
All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5