メッセージ駆動型 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 のタイプに応じてメソッドが作成されます。

命名規則により、メッセージ駆動型 Bean クラスの名前は nameBean となります。 ここで name は、そのメッセージ駆動型 Bean に割り当てた名前です。 例を以下に示します。
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener

javax.ejb.TimedObject インターフェースも実装し、タイマー・コールバック・メソッドを void ejbTimeout(Timer) 呼び出しによって呼び出す場合、メッセージ駆動型 Bean は、時間ベースのイベント通知を行う EJB タイマー・サービスに登録できます。 スケジュールした時間に、コンテナーはメッセージ駆動型 Bean の ejbTimeout メソッドを呼び出します。

メッセージ駆動型 Bean クラスでは、以下のメソッドを定義して実装しなければなりません。
  • 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)

    このメソッドは、タイマー・サービスからの通知をサポートするためにのみ必要となります。このメソッドには、受信したタイム・イベントを処理するビジネス・ロジックが含まれます。

手順

  1. エンタープライズ・アプリケーション・プロジェクトを作成します。
  2. メッセージ駆動型 Bean クラスを作成します。 Rational(r) Application Developer の新規エンタープライズ Bean ウィザードを使用すると、Bean タイプがメッセージ駆動型 Bean であるエンタープライズ Bean を作成できます。

    メッセージ駆動型 Bean クラスの作成方法の例については、このトピックの例のセクションを参照してください。詳しくは、Rational Application Developer インフォメーション・センターの『メッセージ駆動型 Bean の作成』を参照してください。

    このステップの結果、メッセージ駆動型 Bean が生成されます。これは、デプロイメント用の EAR ファイルにアセンブルすることができます。
  3. オプション: EJB デプロイメント記述子エディターを使用して、デプロイメント属性を検討し、必要に応じて変更します。 EJB デプロイメント記述子エディターを使用して、EJB 作成ウィザードで指定したデプロイメント属性 (例えば、トランザクション・タイプおよびメッセージ・セレクターなど) および他のデフォルトのデプロイメント属性を見直すことができます。

    JCA 1.5 準拠のリソースに対するメッセージ駆動型 Bean のデプロイメント属性の構成およびリスナー・ポートに対するメッセージ駆動型 Bean のデプロイメント属性の構成で説明するように、必要に応じて、エンタープライズ・アプリケーションをデプロイメント用に EAR ファイルにエクスポートした後、これらの属性の値をオーバーライドすることができます。

    1. プロパティー・ペインで「Bean」タブを選択します。
    2. メイン・パネルで、「トランザクション・タイプ (Transaction type)」属性を構成します。
      トランザクション・タイプ
      この属性は、メッセージ駆動型 Bean が自身のトランザクションを管理するか、コンテナーが Bean の代わりにトランザクションを管理するかを決定します。
      Bean
      メッセージ駆動型 Bean が自身のトランザクションを管理します。
      コンテナー
      コンテナーが Bean の代わりにトランザクションを管理します。
    3. 「アクティベーション構成」の下で、以下の属性を検討します。
      acknowledgeMode
      この属性では、セッションが受信したすべてのメッセージに応答する方法を決定します。
      自動応答
      セッションは、自動的に各メッセージの配信に応答します。
      重複 OK 応答
      このセッションは、メッセージの送達に応答するのに時間を要します。 この設定では、JMS で障害が発生した場合に重複するメッセージが送達されることがあるため、 メッセージの重複を許容するコンシューマー・アプリケーションでのみ使用してください。

      EJB 仕様で定義されているように、クライアントは Message.acknowledge() メソッドを使用してメッセージに応答することはできません。createxxxSession 呼び出しで CLIENT_ACKNOWLEDGE の値が渡されると、メッセージは、アプリケーション・サーバーによって自動的に応答され、Message.acknowledge() メソッドは使用されません。

      注:

      メッセージが削除されると、応答が送信されます。

      非トランザクションのメッセージ駆動型 Bean がある場合、システムは、メッセージ駆動型 Bean の開始時または完了時のいずれかの時点で、メッセージを削除します。 メッセージ駆動型 Bean が例外を生成し、そのために Bean が完了しない場合、システムは以下のいずれかのアクションを実行します。
      • システムが、メッセージ駆動型 Bean の完了時にメッセージを削除するように構成されている場合、メッセージはメッセージ駆動型 Bean の新規インスタンスにディスパッチされるため、別のタイミングで処理されます。
      • システムが、メッセージ駆動型 Bean の開始時にメッセージを削除するように構成されている場合、メッセージは失われます。

      サービスの品質がベスト・エフォート非パーシスタントに設定されている場合、メッセージ駆動型 Bean が開始するときにメッセージは削除されます。他のすべてのサービスの品質の場合、メッセージはメッセージ駆動型 Bean が完了するときに削除されます。

      destinationType
      この属性は、メッセージ駆動型 Bean がキュー宛先を使用するか、トピック宛先を使用するかを決定します。
      キュー
      メッセージ駆動型 Bean はキュー宛先を使用します。
      トピック
      メッセージ駆動型 Bean はトピック宛先を使用します。
      subscriptionDurability
      この属性は、JMS トピック・サブスクリプションが永続か非永続かを決定します。
      永続的
      サブスクライバーは、JMS に保存された固有の ID を持つ永続的サブスクリプションを登録します。 同一 ID を持つ後続のサブスクライバー・オブジェクトが再開するサブスクリプションは、先行するサブスクライバーが残した状態のままです。 永続的サブスクリプションのアクティブ・サブスクライバーがない場合、サブスクリプション・メッセージがサブスクリプションによって受信されるか、またはメッセージの有効期限が切れるまで、JMS はメッセージを保持します。
      非永続的
      非永続サブスクリプションは、所有するサブスクライバー・オブジェクトの存続時間中は持続します。 すなわち、トピックにパブリッシュされたメッセージをクライアントが確認できるのは、サブスクライバーがアクティブの間だけです。サブスクライバーがアクティブでない場合、クライアントはそのトピックに関して公開されたメッセージを見られません。

      非永続サブスクライバーは、そのサブスクライバーが作成されたときに存在していたものと同じトランザクション・コンテキスト (例えば、グローバル・トランザクションまたは未指定のトランザクション・コンテキスト) でしか使用できません。

      messageSelector
      この属性は、メッセージ駆動型 Bean が受信するメッセージを選択するために使用する JMS メッセージ・セレクターを決定します。 例:
      JMSType='car' AND color='blue' AND weight>2500

      セレクター・ストリングは、JMS メッセージ・ヘッダー内のフィールド、およびメッセージ・プロパティー内のフィールドを参照できます。メッセージ・セレクターは、メッセージ本体の値を参照することはできません。

    4. バインディング・デプロイメント属性を指定します。

      「WebSphere バインディング」の下で、JCA アダプター のオプションを選択してから、バインディング・デプロイメント属性を指定します。

      ActivationSpec JNDI 名
      この属性は、このメッセージ駆動型 Bean をデプロイするために使用されるアクティベーション・スペックの JNDI 名を指定します。この名前は WebSphere Application Server に定義するアクティベーション・スペックの名前と一致しなければなりません
      ActivationSpec 許可別名
      この属性は、JCA リソース・アダプターへの接続の認証に使用される認証別名の名前を指定します。 認証別名は、JCA リソース・アダプターへの新規接続の作成を認証するために使用されるユーザー ID およびパスワードを指定します。
      宛先 JNDI 名
      この属性は、メッセージ駆動型 Bean が JNDI 名前空間で JMS 宛先を検索するために使用する JNDI 名を指定します。
    5. オプション: メッセージ・リンクを有効にするには、「宛先リンク (Destination Link)」を指定します。

      メッセージ・リンクによって、メッセージをデプロイメント内の特定のメッセージ駆動型 Bean にルーティングできるようになります。またメッセージ・リンクによって、同じアプリケーション内のコンポーネント間でメッセージ・フローを調整できるようになります。

      メッセージがメッセージ駆動型 Bean によって消費および処理されるには、メッセージ駆動型 Bean に関連したデプロイメント記述子で <message-destination-link> エレメントを定義する必要があります。 <message-destination-link>エレメントによって識別された宛先は、論理宛先と対応しています。

      <message-destination-ref><message-destination-link> エレメントが含まれる場合、メッセージが該当の宛先で消費されます。

      メッセージ駆動型 Bean に宛先に送信されるメッセージを消費させるには、<message-destination-link> エレメントをデプロイメント記述子で宣言するか、あるいはアクティベーション・スペックで設定できます。

  4. アプリケーションをデプロイメント用にアセンブルおよびパッケージ化します。

タスクの結果

このタスクの結果として生成される EAR ファイルには、エンタープライズ・アプリケーション用のメッセージ駆動型 Bean が含まれ、WebSphere Application Server でデプロイすることができます。

以下の例は、メッセージ駆動型 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;
}

次のタスク

メッセージ駆動型 Beanを使用するエンタープライズ・アプリケーションを開発した後で、そのアプリケーションを構成してデプロイします。 例えば、メッセージ駆動型 Bean のアクティベーション・スペックを定義し、オプションでアプリケーションのデプロイメント記述子属性を変更します。 詳しくは、メッセージ駆動型 Bean を JCA 1.5 準拠リソースとともに使用するためのエンタープライズ・アプリケーションのデプロイおよびリスナー・ポートを持つメッセージ駆動型 Bean を使用するエンタープライズ・アプリケーションのデプロイを参照してください。

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmb_devap
ファイル名:tmb_devap.html