SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java Message Service再入門

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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を使う理由です。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
MDBを使っての実装

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Java Message Service再入門連載記事一覧
この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5018 2010/04/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング