Sun ONE ロゴ     前へ      目次      索引      次へ     
Sun ONE Application Server 7 Enterprise Java Beans 開発者ガイド



メッセージ駆動型 Beans の使用

この章では、メッセージ駆動型 Beans について、および Sun ONE Application Server 7 環境で作成する際の要件について説明します。



メッセージ駆動型 Beans または EJB テクノロジに精通していない場合は、Java Software チュートリアルを参照してください。

    http://java.sun.com/j2ee/docs.html

メッセージ駆動型 Beans に関する詳細情報は、『Enterprise JavaBeans Specification, v2.0』の第 15 章と第 16 章にあります。

Sun ONE Application Server の概要は、「Sun ONE Application Server Enterprise JavaBeans の紹介」および『Sun ONE Application Server 製品の概要』にあります。



この章には次の項目があります。

メッセージ駆動型 Beans について

メッセージ駆動型 Bean は、J2EE アプリケーションでメッセージを非同期的に処理できる Enterprise JavaBeans (EJB) です。この Bean はメッセージリスナの働きをします。イベントリスナと似ていますが、イベントの代わりにメッセージを受け取ります。アプリケーションクライアント、別の Enterprise JavaBean、Web コンポーネントなどの J2EE コンポーネントから送信されるメッセージや、J2EE テクノロジを利用しないアプリケーションやシステムから送信されるメッセージを処理できます。

この節では次の項目について説明します。

メッセージ駆動型 Beans の相違点

セッション Beans およびエンティティ Beans では、JMS メッセージを同期的に送受信できますが、非同期の送受信はできません。サーバーリソースの停滞を避けるために、サーバー側のコンポーネントで非同期受信を使用するとよいでしょう。非同期にメッセージを受信するには、メッセージ駆動型 Bean を使用します。

メッセージ駆動型 Beans とセッションおよびエンティティ Beans のもっとも大きな目に見える違いは、クライアントがインタフェースを通じてメッセージ駆動型 Beans にアクセスしないことです。セッション Bean やエンティティ Bean とは異なり、メッセージ駆動型 Bean には 1 つの Bean クラスしかありません。

メッセージ駆動型 Bean は、次のような点で、ステートレスセッション Bean に似ています。

  • メッセージ駆動型 Bean のインスタンスは、特定のクライアントのデータや会話型状態を保持しない
  • メッセージ駆動型 Bean のすべてのインスタンスは同等であり、コンテナはそれらのメッセージ駆動型 Bean インスタンスをプールできる。このため、メッセージのストリームを同時に処理できる
  • 1 つのメッセージ駆動型 Bean が複数のクライアントからのメッセージを処理できる。

メッセージ駆動型 Bean インスタンスのインスタンス変数は、JMS 接続、オープンデータベース接続、EJB オブジェクトへのオブジェクト参照などの、クライアントメッセージの処理に関連する状態のいくつかを保持できます。

メッセージ駆動型 Beans の特性

メッセージ駆動型 Bean インスタンスは、メッセージ駆動型 Bean クラスのインスタンスです。ホームインタフェースもリモートインタフェースもなく、メッセージ駆動型 Bean は匿名です。つまり、クライアントに見える識別情報を持ちません。

クライアントは、メッセージ駆動型 Bean クラスが MessageListener であるメッセージの送信先にメッセージを送信することによって、JMS からメッセージ駆動型 Bean にアクセスします。メッセージ駆動型 Bean のキューとトピックは、配備時に Sun ONE Application Server リソースを使って割り当てられます。

メッセージ駆動型 Beans には次の特性があります。

  • 1 つのクライアントメッセージを受信すると実行される
  • 非同期的に呼び出される
  • 比較的短命である
  • データベース内の共有データを直接表さないが、このデータのアクセスおよび更新は可能である
  • トランザクションを認識できる
  • 状態を持たない

トランザクション管理

『Enterprise JavaBeans Specification, v2.0』に定義されたコンテナ管理トランザクションと Bean 管理トランザクションの両方がサポートされています。

コンテナ管理トランザクションでは、トランザクションコンテキスト内でメッセージ駆動型 Bean にメッセージを配信することもできます。その場合、onMessage メソッド内のすべてのオペレーションが 1 つのトランザクションに含まれます。メッセージ処理がロールバックされると、メッセージは再度配信されます。

トランザクションについては、「Enterprise JavaBeans のトランザクション処理」を参照してください。

メッセージの同時処理

コンテナでは、メッセージ駆動型 Bean クラスの複数のクラスを同時に実行できるので、メッセージのストリームの同時処理が可能です。コンテナは、メッセージ処理の同時性を損なわないように時間順にメッセージを配信しようとしますが、メッセージ駆動型 Bean クラスのインスタンスにメッセージが配信される正確な順序は保証されません。

そのため、メッセージ駆動型 Beans は、順序が乱れたメッセージを処理できるようにしておきます。たとえば、予約を入れるメッセージの前に、予約を取り消すメッセージが配信されることがあります。

メッセージ駆動型 Beans の開発

メッセージ駆動型 Bean モデルを利用すると、非同期に呼び出されて受信メッセージを処理する Enterprise JavaBean を、ほかの JMS リスナーで同じ機能を開発するのと同じくらい簡単に開発できます。さらに、コンテナが提供するメッセージ駆動型 Bean インスタンスのプール機能によって、メッセージのストリームを同時処理することもできます。

次の各項で、メッセージ駆動型 Beans を作成する際のガイドラインを示します。

Bean クラス定義の作成

セッション Beans およびエンティティ Beans とは異なり、メッセージ駆動型 Beans には、クライアントアクセスを定義するリモートインタフェースやローカルインタフェースがありません。クライアントコンポーネントは、メッセージ駆動型 Beans を探して、そのメソッドを直接起動することはできません。

メッセージ駆動型 Beans はビジネスメソッドを持ちませんが、onMessage メソッドによって内部的に呼び出されるヘルパーメソッドを含めることができます。

メッセージ駆動型 Beans のクラスは、次の必要条件を満たす必要があります。

  • 直接または間接的に、javax.ejb.MessageDrivenBean インタフェースを実装する必要がある
  • 直接または間接的に、javax.ejb.MessageListener インタフェースを実装する必要がある
  • public として定義する必要があり、abstract または final として定義してはならない
  • 引数をとらないパブリックコンストラクタ (メッセージ駆動型 Bean クラスのインスタンスを作成するためにコンテナが使用する) を持つ必要がある
  • finalize メソッドを定義してはならない
  • onMessage メソッドを実装する必要がある
  • 引数なしの ejbCreate メソッドを 1 つ実装する必要がある
  • 引数なしの ejbRemove メソッドを 1 つ実装する必要がある

次の各項では、メッセージ駆動型 Bean のクラス定義内のさまざまなメソッドについて説明します。

ejbCreate の使用

メッセージ駆動型 Bean クラスでは、ejbCreate メソッドを 1 つ定義する必要があり、そのシグネチャは次のルールに従っている必要があります。

  • メソッド名は ejbCreate にする必要がある
  • public として定義する必要があり、final または static として定義してはならない
  • 戻り値タイプは void にする必要がある
  • 引数をとってはならない
  • throws 句でアプリケーション例外を定義してはならない

setMessageDrivenContext の使用

コンテナは、メッセージ駆動型 Beans インスタンスに MesssageDrivenContext を提供します。これにより、メッセージ駆動型 Bean インスタンスは、コンテナが維持するそのインスタンスのコンテキストにアクセスできます。

onMessage の使用

onMessage メソッドは、1 つの引数 (受信メッセージ) をとります。

onMessage メソッドは、Bean が処理するメッセージが到着したときに、Bean のコンテナによって呼び出されます。このメソッドには、メッセージを処理するビジネスロジックが含まれています。メッセージを解析して必要なビジネスロジックを実行するのが、メッセージ駆動型 Bean の役割です。

メッセージ駆動型 Bean クラスでは、onMessage メソッドを 1 つ定義する必要があり、そのシグネチャは次のルールに従っている必要があります。

  • public として定義する必要があり、final または static として定義してはならない
  • 戻り値タイプは void にする必要がある
  • タイプ javax.jms.Message の引数を 1 つだけとる必要がある
  • throws 句でアプリケーション例外を定義してはならない。onMessage から例外をスローするためのセマンティックについては、「onMessage のランタイム例外」を参照

onMessage メソッドは、配備記述子内に指定されたトランザクション属性によって決定されるトランザクションの範囲内で呼び出されます。



コンテナ管理トランザクションの境界設定を使用するように指定されている Bean では、トランザクション属性の Required または NotSupport のどちらかを配備記述子に指定する必要があります。



ejbRemove の使用

メッセージ駆動型 Bean クラスでは、Bean が不要になったときに解放するための ejbRemove メソッドを 1 つ定義します。そのシグネチャは次の規則に従っている必要があります。

  • メソッド名は ejbRemove にする必要がある
  • public として定義する必要があり、final または static として定義してはならない
  • 戻り値タイプは void にする必要がある
  • 引数をとってはならない
  • throws 句でアプリケーション例外を定義してはならない


  • コンテナが必ずメッセージ駆動型 Bean インスタンスで ejbRemove を呼び出すと想定することはできません。



EJB コンテナがクラッシュしている場合、またはインスタンスの onMessage メソッドからコンテナに例外がスローされた場合は、ejbRemove メソッドは呼び出されません。メッセージ駆動型 Bean のインスタンスが ejbCreate メソッドまたは onMessage メソッド、あるいはその両方でリソースを割り当て、ejbRemove メソッドでリソースを解放する場合、それらのリソースは自動的に解放されません。そのため、アプリケーションで、未解放のリソースを定期的にクリーンアップするメカニズムを提供する必要があります。

設定

ここでは、設定に関する次の項目について説明します。

接続ファクトリと送信先

メッセージ駆動型 Bean は JMS クライアントです。したがって、メッセージ駆動型 Bean のコンテナは、Sun ONE Application Server に統合された JMS サービスを使用します。JMS クライアントは、JMS 接続ファクトリと送信先が管理するオブジェクトを使用します。JMS 接続ファクトリが管理するオブジェクトは、JMS プロバイダへの接続を作成するためのリソースマネージャの接続ファクトリオブジェクトです。

メッセージ駆動型 Bean の sun-ejb-jar.xml 内の mdb-connection-factory 要素を使用して、コンテナが JMS プロバイダへのコンテナ接続を作成するときに使用する接続ファクトリを指定できます。この要素は、サードパーティの JMS プロバイダでも利用できます。

mdb-connection-factory が指定されていない場合、サーバーの起動時に作成されたデフォルトの接続ファクトリが使用されます。これにより、内蔵の Sun ONE Message Queue のデフォルトユーザー名とパスワード (リソースプリンシパル) を使って、server.xml ファイルの jms-service 要素に指定されているポート (指定が有効化されている場合) の Sun ONE Message Queue ブローカに接続できます。詳細は、『Sun ONE Message Queue 開発者ガイド』を参照してください。

sun-ejb-jar.xml ファイル内の ejb 要素の jndi-name 要素は、メッセージ駆動型 Bean と関連付けられた JMS のキューまたはトピックの送信先として、管理オブジェクトの JNDI 名を指定します。

メッセージ駆動型 Bean プール

コンテナは、一連のメッセージを同時処理できるように、メッセージ駆動型 Bean のプールを管理します。Sun ONE Application Server 固有 Bean の配備記述子には、プールを定義する要素 (bean-pool 要素) が含まれます。

  • steady-pool-size
  • resize-quantity
  • max-pool-size
  • pool-idle-timeout-in-seconds

これらの要素に関する詳細は、「プールとキャッシュの要素」を参照してください。

サーバーインスタンス全体に適用される属性

管理者は、server.xml ファイル内の mdb-container 要素で、サーバーインスタンス全体のメッセージ駆動型 Bean に関する次の属性を制御できます。

  • steady-pool-size
  • pool-resize-quantity
  • max-pool-size
  • idle-timeout-in-seconds
  • log-level
  • monitoring-enabled

これらの属性に関する詳細は、「プールとキャッシュの要素」および『Sun ONE Application Server 管理者用設定ファイルリファレンス』を参照してください。

メッセージ駆動型 Beans の監視については、Sun ONE Application Server 管理インタフェース のオンラインヘルプ、および『管理者ガイド』を参照してください。



必要な時以外に監視を行うと、パフォーマンスに影響することがあります。使用しない場合は asadmin コマンドまたは管理インタフェースを使って監視をオフにできます。



JMS プロバイダへの自動再接続

Sun ONE Application Server を起動すると、配備したメッセージ駆動型 Bean ごとにコンテナが JMS プロバイダへの接続を維持します。接続が断たれると、コンテナは JMS プロバイダからのメッセージを受信できなくなるため、メッセージ駆動型 Bean インスタンスにメッセージを配信できなくなります。自動再接続機能を有効にしておくと、接続が断たれた場合にコンテナが JMS プロバイダへの再接続を自動的に試みます。

server.xml ファイルの mdb-container 要素には、自動再接続のプロパティが含まれます。デフォルトでは、reconnect-enabled は true に設定され、reconnect-delay-in-seconds は 60 秒に設定されます。つまり、再接続は 60 秒おきに試みられます。reconnect-max-retries は 60 回に設定されます。

コンテナは、再接続を試みるたびにメッセージを記録します。



メッセージ処理の段階に応じて、接続が断たれた場合に onMessage メソッドが正常に完了されなかったり、JMS 例外によってトランザクションがロールバックされたりすることがあります。コンテナが JMS プロバイダへの再接続を確立すると、JMS メッセージ再配信セマンティックが適用されます。



server.xml ファイルの mdb-container 要素に指定する自動再接続のプロパティについては、『Sun ONE Application Server 管理者用設定ファイルリファレンス』を参照してください。

制限事項と最適化

この節では、メッセージ駆動型 Beans を開発する際に注意する制限事項およびパフォーマンスの最適化について説明します。

JMS に関する制限事項

Sun ONE Application Server では、Sun ONE Message Queue 3.0.1 Platform Edition が提供する組み込みの JMS サービスによる JMS メッセージングをサポートしています。スタンドアロン製品としての Sun ONE Message Queue 3.0.1 では、JMS 1.1 仕様をサポートしています。ただし、Sun ONE Application Server 7 では、より限定的な JMS 1.02b 仕様のみを範囲とする J2EE 1.3 仕様をサポートしています。そのため、JMS 1.1 に組み入れられた追加機能は、Sun ONE Application Server 7 で実行するアプリケーションには使用できません。

したがって、JMS メッセージングアプリケーションの開発では、Sun ONE Application Server 環境で実行する JMS クライアントコンポーネントを JMS 1.02b に限定する必要があります。詳細は、『Sun ONE Message Queue 開発者ガイド』または『リリースノート』を参照してください。

プールの調整と監視

メッセージ駆動型 Bean のプールはスレッドのプールでもあり、プール内の各メッセージ駆動型 Bean インスタンスはサーバーセッションに関連付けられ、各サーバーセッションはスレッドに関連付けられます。このため、容量の大きなプールではスレッド数も多く、パフォーマンスとサーバーリソースに影響します。

メッセージ駆動型 Bean プールのプロパティを設定するときは、メッセージの受信頻度と受信パターン、onMessage メソッドの処理時間、サーバーリソース全体 (スレッド、メモリなど)、およびメッセージ駆動型 Bean がアクセスするその他リソースに起因する同時処理の要件と制限を考慮する必要があります。

パフォーマンスとリソース使用率の調整では、コンテナが使用する接続ファクトリ (配備記述子の mdb-connection-factory 要素) の潜在的な JMS プロバイダプロパティについても注意する必要があります。たとえば、接続ファクトリの Sun ONE Message Queue のフロー制御に関するプロパティは、メッセージの受信頻度が max-pool-size が対応する値を大きく上回る状況を考慮して調整する必要があります。

メッセージ駆動型 Bean プールの統計情報を入手する方法については、『Sun ONE Application Server 管理者ガイド』を参照してください。

onMessage のランタイム例外

正常に機能しているその他の JMS MessageListeners と同様、一般に、メッセージ駆動型 Bean にランタイム例外をスローさせることはできません。メッセージ駆動型 Bean の onMessage メソッドがシステムレベルの例外やエラーに遭遇し、メソッドが正常に完了しない場合、『Enterprise JavaBeans Specification, v2.0』には次のようなガイドラインが示されています。

  • Bean メソッドがランタイム例外またはエラーに遭遇した場合は、Bean メソッドからコンテナに単にエラーを伝達する
  • Bean メソッドの動作によって、Bean メソッドが復旧できないチェック済みの例外が発生した場合は、Bean メソッドは元の例外をラップする javax.ejb.EJBException をスローする
  • 上記以外の予期せぬエラー状況については、javax.ejb.EJBException を使って報告する (javax.ejb.EJBExceptionjava.lang.RuntimeException のサブクラス)

コンテナ管理トランザクションの境界設定では、メッセージ駆動型 Bean の onMessage メソッドからランタイム例外を受け取ると、コンテナは、コンテナが開始したトランザクションをロールバックし、JMS メッセージが再配信されます。これは、メッセージ配信自体がコンテナが開始したトランザクションの一部であるためです。デフォルトでは、メッセージ駆動型 Bean インスタンスの onMessage メソッドから最初のランタイム例外を受け取ると、Sun ONE Application Server コンテナは JMS プロバイダへのコンテナの接続を閉じます。これにより、メッセージ駆動型 Bean の onMessage メソッドに異常が続いても、メッセージ再配信のループを回避でき、サーバーリソースを保護できます。このコンテナのデフォルト設定は、server.xml ファイル内の mdb-container 要素の cmt-max-runtime-exceptions プロパティを使って変更できます。

cmt-max-runtime-exceptions プロパティは、コンテナの JMS プロバイダへの接続を終了し始めるまでに、コンテナがメッセージ駆動型 Bean の onMessage メソッドから何回のランタイム例外を受け取るか、その最大数を指定します。デフォルト値は 1 です。-1 を指定すると、このコンテナ保護を無効化します。

メッセージ駆動型 Bean の onMessage メソッドは、javax.jms.Message getJMSRedelivered メソッドを使うことで、受信したメッセージが再配信されたメッセージであるかどうかを調べることができます。



cmt-max-runtime-exceptions プロパティは、将来廃止される可能性があります。



メッセージ駆動型 Beans XML ファイルの例

この節では、次のファイルの例を示します。

メッセージ駆動型 Bean に関連する要素については、「sun-ejb-jar.xml ファイルの要素」および『Sun ONE Application Server 開発者ガイド』を参照してください。

ejb-jar.xml ファイルの例

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>

<ejb-jar>
   <enterprise-beans>
      <message-driven>
         <ejb-name>MessageBean</ejb-name>
         <ejb-class>samples.mdb.ejb.MessageBean</ejb-class>
         <transaction-type>Container</transaction-type>
         <message-driven-destination>
            <destination-type>javax.jms.Queue</destination-type>
         </message-driven-destination>
         <resource-ref>
            <res-ref-name>jms/QueueConnectionFactory</res-ref-name>
            <res-type>javax.jms.QueueConnectionFactory</res-type>
            <res-auth>Container</res-auth>
         </resource-ref>
      </message-driven>
   </enterprise-beans>
      <assembly-descriptor>
         <container-transaction>
            <method>
               <ejb-name>MessageBean</ejb-name>
               <method-intf>Bean</method-intf>
               <method-name>onMessage</method-name>
               <method-params>
                  <method-param>javax.jms.Message</method-param>
               </method-params>
            </method>
         <trans-attribute>NotSupported</trans-attribute>
      </container-transaction>
   </assembly-descriptor
</ejb-jar>

sun-ejb-jar.xml ファイルの例

これらの要素の詳細については、「sun-ejb-jar.xml ファイルの要素」を参照してください。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7.0 EJB 2.0//EN' 'http://www.sun.com/software/sunone/appserver/dtds/sun-ejb-jar_2_0-0.dtd'>

<sun-ejb-jar>
   <enterprise-beans>
      <ejb>
         <ejb-name>MessageBean</ejb-name>
         <jndi-name>jms/sample/Queue</jndi-name>
         <resource-ref>
            <res-ref-name>jms/QueueConnectionFactory</res-ref-name>
            <jndi-name>jms/sample/QueueConnectionFactory</jndi-name>
            <default-resource-principal>
               <name>guest</name>
               <password>guest</password>
            </default-resource-principal>
         </resource-ref>
         <mdb-connection-factory>
            <jndi-name>jms/sample/QueueConnectionFactory</jndi-name>
            <default-resource-principal>
               <name>guest</name>
               <password>guest</password>
            </default-resource-principal>
         </mdb-connection-factory>
      </ejb>
   </enterprise-beans>
</sun-ejb-jar>


前へ      目次      索引      次へ     
Copyright 2002 Sun Microsystems, Inc. All rights reserved.