メッセージ駆動型 Bean を使用するエンタープライズ・アプリケーションの開発
アプリケーションは非同期メッセージ・コンシューマーとしてメッセージ駆動型 Bean を使用できます。 宛先へのメッセージ・リスナーとしてメッセージ駆動型 Bean をデプロイします。 モニターされている入力宛先にメッセージが到着すると、アクティベーション・スペックまたは JMS リスナーによってメッセージ駆動型 Bean が呼び出されます。
このタスクについて
メッセージ駆動型 Bean を使用するエンタープライズ・アプリケーションは、メッセージ駆動型 Bean がホーム・インターフェースやリモート・インターフェースを持たないことを除いて、他のエンタープライズ Bean と同様に開発します。
着信メッセージのビジネス・プロセスを別のエンタープライズ Bean で代行するように、 メッセージ駆動型 Bean を開発してください。そうすることで、メッセージ処理とビジネス・プロセスを明確に分離することができます。 また、このように分離することにより、ビジネス・プロセスを、着信メッセージの到着により呼び出したり、あるいは WebSphere® J2EE クライアントなどから呼び出したりすることもできます。 応答は、送信側 Bean として動作している別のエンタープライズ Bean で処理することも、メッセージ駆動型 Bean で処理することもできます。
EJB 2.0 メッセージ駆動型 Bean は、Java™ Message Service (JMS) メッセージングのみをサポートします。EJB 2.1 および EJB 3 のメッセージ駆動型 Bean は、JMS 以外に、他のメッセージング・タイプをサポートできます。すべてのメッセージ駆動型 Bean は、MessageDrivenBean インターフェースを実装する必要があります。 JMS メッセージングでは、メッセージ駆動型 Bean はメッセージ・リスナー・インターフェース、javax.jms.MessageListener も実装する必要があります。Java EE コネクター・アーキテクチャー (JCA) 準拠のその他のリソース・アダプターは、実装する必要がある独自のメッセージ・リスナー・インターフェースを提供する場合があります。
Rational® Application Developer の新規エンタープライズ Bean ウィザードを使用すると、Bean タイプがメッセージ駆動型 Bean であるエンタープライズ Bean を作成できます。このウィザードで、Bean のタイプに応じてメソッドが作成されます。
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener
javax.ejb.TimedObject インターフェースも実装し、タイマー・コールバック・メソッドを void ejbTimeout(Timer) 呼び出しによって呼び出す場合、メッセージ駆動型 Bean は、時間ベースのイベント通知を行う EJB タイマー・サービスに登録できます。 スケジュールした時間に、コンテナーはメッセージ駆動型 Bean の ejbTimeout メソッドを呼び出します。
- onMessage(message)。以下の要件を満たす必要があります。
- このメソッドが、javax.jms.Message タイプの引数を 1 つ持つこと。
- throws 文節で、アプリケーション例外を定義しない こと。
- メッセージ駆動型 Bean が Bean 管理トランザクションを使用するように構成されている場合、javax.transaction.UserTransaction インターフェースを呼び出してトランザクションの有効範囲を定めること。 これらの呼び出しは、onMessage() メソッド内部で行われるため、トランザクションの有効範囲に初期メッセージの受信は含まれません。 詳しくは、メッセージ駆動型 Bean のトランザクション・サポートのトピックを参照してください。
onMessage() メソッド内でメッセージを処理する (例えば、メッセージを別のエンタープライズ Bean に渡す) には、標準 JMS を使用します。 これは、Bean 管理メッセージングと呼ばれます。
別のメッセージ・リスナー・インターフェースを含む JCA 準拠リソース・アダプターを使用している場合は、onMessage() 以外のメソッドが必要になることがあります。必要なメッセージ・リスナー・インターフェースについて詳しくは、JCA 準拠リソース・アダプターに同梱の文書を参照してください。
- ejbCreate()。
エンタープライズ Bean の新規のインスタンスを作成する方法ごとに、ejbCreate メソッドを定義して実装する必要があります。
- ejbRemove()
このメソッドは、エンタープライズ Bean のホーム・インターフェースが javax.ejb.EJBHome インターフェースから継承した remove メソッドを、クライアントが呼び出すときに、コンテナーによって呼び出されます。 このメソッドには、エンタープライズ Bean インスタンスがコンテナーから除去される前 (そして関連付けられているデータがデータ・ソースから除去される前) に実行したいコードはすべて含まれなければなりません。
- ejbTimeout(Timer)
このメソッドは、タイマー・サービスからの通知をサポートするためにのみ必要となります。このメソッドには、受信したタイム・イベントを処理するビジネス・ロジックが含まれます。
手順
タスクの結果
例
以下の例は、メッセージ駆動型 Bean クラスの作成方法を示しています。このコード例は、TextMessage タイプの JMS メッセージから、テキストおよび JMS MessageID にアクセスする方法を示しています。この例では、まずメッセージ駆動型 Bean の onMessage() メソッドを使用して、着信テキスト・メッセージをアンパックし、テキストおよびメッセージ ID を抽出します。次に、private putMessage メソッド (同じメッセージ駆動型 Bean クラス内で定義) を使用して、メッセージを別のキューに入れます。
public void onMessage(javax.jms.Message msg)
{
String text = null;
String messageID = null;
try
{
text = ((TextMessage)msg).getText();
System.out.println("senderBean.onMessage(), msg text2: "+text);
//
// store the message id to use as the Correlator value
//
messageID = msg.getJMSMessageID();
// Call a private method to put the message onto another queue
putMessage(messageID, text);
}
catch (Exception err)
{
err.printStackTrace();
}
return;
}