Enterprise JavaBeans 3.0仕様入門
Pages: 1, 2, 3, 4, 5, 6

メッセージ駆動型Bean

ここで、EJBの最後のタイプであるメッセージ駆動型Beanについて見てみましょう。

ビジネスインタフェース

メッセージ駆動型Bean(MDB)のビジネスインタフェースは、Beanに対して使用されているメッセージングタイプによって決定されるメッセージリスナインタフェースです。インタフェースは javax.jms.MessageListenerです。メッセージ駆動型Beanは、メッセージ駆動型Beanがサポートするメッセージングタイプ用の適切なメッセージリスナインタフェースを実装するか、またはそのメッセージリスナインタフェースを、 @MessageDriven注釈またはデプロイメント記述子を使用して指定する必要があります。

Beanクラス

EJB 3.0では、MDB Beanクラスは @MessageDriven注釈で表されます。この注釈では、このMDBが監視するメッセージキュー(queue/mdbなど)を指定します。

BeanクラスはMessageListenerインタフェースを実装する必要があります。このインタフェースは1つのメソッド onMessage()だけを定義します。このMDBが監視するキューにメッセージが到着すると、コンテナはBeanクラスの onMessage()メソッドを呼び出し、着信したメッセージを呼び出しパラメータとして渡します。

ここで示す例では、 TraderBean.onMessage()メソッドがメッセージの本体を取り出し、パラメータを 展開し、取引処理を実行し、結果を静的データマネージャクラスに保存します。サービスリクエストメッセージの「sent」タイムスタンプは、計算レコード の一意なIDとして機能します(トラフィックの少ないWebサイトで有効な方法です)。JSPページ check.jspは、メッセージIDに基づいて計算レコードを選択し、表示します。

@MessageDriven(activateConfig =
{
  @ActivationConfigProperty(propertyName="destinationType",
    propertyValue="javax.jms.Queue"),
  @ActivationConfigProperty(propertyName="destination",
    propertyValue="queue/mdb")
})
public class TraderBean implements MessageListener {

  public void onMessage (Message msg) {
    try {
      TextMessage tmsg = (TextMessage) msg;
      Timestamp sent =
          new Timestamp(tmsg.getLongProperty("sent"));
      StringTokenizer st =
          new StringTokenizer(tmsg.getText(), ",");

           buy ("SNPS",1000);

      RecordManager.addRecord (sent, "BUY SUCCESSFUL");

    } catch (Exception e) {
      e.printStackTrace ();
    }
  }
  // ... ...
}

メッセージの送信

メッセージ駆動型Beanを使用するために、クライアント(この場合のJSPページtrader.jspなど)は標準JMS APIを使用し、キュー名(queue/mdb)を指定してMDBに対するターゲットメッセージキューを取得し、メッセージをキューに送信します。

try {
  InitialContext ctx = new InitialContext();
  queue = (Queue) ctx.lookup("queue/mdb");
  QueueConnectionFactory factory =
    (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
  cnn = factory.createQueueConnection();
  sess = cnn.createQueueSession(
           false,QueueSession.AUTO_ACKNOWLEDGE);
} catch (Exception e) {
    e.printStackTrace ();
}
TextMessage msg = sess.createTextMessage("SNPS",1000);
sender = sess.createSender(queue);
sender.send(msg);

メッセージ駆動型Beanのコールバック

メッセージ駆動型Beanに対しては、次のライフサイクルイベントコールバックがサポートされています。

  • PostConstruct
  • PreDestroy

従来のエンティティモデルの今後

古いエンティティモデルは現在もEJBの一部であり、互換性上の理由から、将来的にもEJBに残される予定です。エキスパートグループでは現在、 EJB 3.0のさまざまな新機能の動向を注視しています。それらの機能は従来のプログラミングモデルを使用している人々にとっても有益と考えられ、グループで は、そのような人々も新しい機能を利用できるようにするための方法を検討しています。EJB 3.0では、EJB 2.1スタイルのCMPエンティティBeanのためにEJB-QLを拡張することが計画されています。しばらくの間は従来のプログラミングモデルにとどま りたいという場合はそれも可能であり、並行して新しい機能を少しずつ試していくことができます。

まとめ

EJB 3.0は、開発を簡素化し、テスト駆動型開発を促進し、複雑なAPIではなくシンプルなJavaオブジェクト(POJO)に軸足を移すことにより、EJB プログラミングを快適なものにするための大きな進化を遂げています。この記事で詳しく論じなかった重要なトピックの1つに、仕様で定義されている新しい永 続性フレームワークがあります。詳細については、 EJB 3.0 API仕様のサイトから、EJB 3.0の永続性関連のドキュメントをダウンロードしてください。

BEA Systemsは、BEA WebLogic ServerにおけるEJB3実装戦略に積極的に取り組んでいます。実装の詳細とロードマップについては、確定次第順次このWebサイトで公開する予定です。

関連情報

Vimala RanganathanはBEAの上級デベロッパリレーションズエンジニアです。Vimalaはコンピュータサイエンスの学士号を取得しており、Sun認定Javaアーキテクト/プログラマとしての顔も持ちます。

Anurag PareekはBEA Systemsのエスカレーションエンジニアです。ミッションクリティカルアプリケーションや高可用性アプリケーションの実装、チューニング、トラブルシューティングに関する豊富な経験を持ちます。