Oracle® Fusion Middleware Oracle WebLogic ServerメッセージドリブンBeanのプログラミング 11g リリース1 (10.3.6) B61425-04 |
|
前 |
次 |
MDB内では、データベース・トランザクションを含む場合もあるビジネス・ロジックは、onMessage()
メソッド内で実行されます。EJBアプリケーション内では、複数のMDBは複数のonMessage()
呼出しを同時に実行できます。各onMessage()
呼出しがコンテナ管理対象トランザクションを実行する場合、多数のオーバーヘッドが作成されます。
WebLogic Serverは、onMessage()
が単一のトランザクションの下で同時に呼び出す、複数のコンテナ管理対象トランザクションMDBをグループ化するためのメカニズムを提供します。このメカニズムは、異なるonMessage
呼出しのすべての処理を単一のリクエストに暗黙的にグループ化することによって、EJBアプリケーションのパフォーマンス向上に役立ちます。
MDB内でのトランザクション管理については、「MDBのトランザクション管理戦略の構成」を参照してください。
注意: トランザクション・バッチ処理は、すべてのMDBアプリケーションに対して有効というわけではありません。たとえば、MDBがデータベースに対して複数の呼出しを行うアプリケーションでは、データベースのデッドロックが発生する場合があります。トランザクション・バッチ処理機能を使用すると、MDBはトランザクションにつき、より多くの行をロックするようになり、これがデータベースのデッドロックを引き起こす場合があります。 |
max-messages-in-transaction
要素を定義するか、またはactivationConfigProperty
で同等のプロパティを使用することによって、MDBトランザクションのバッチ処理を有効化できます。この要素は、weblogic-ejb-jar.xml
デプロイメント記述子のmessage-driven-descriptor
要素の一部です。
max-messages-in-transaction
は、WebLogic ServerがonMessage()
トランザクションを処理する際に使用するバッチ・サイズを定義します。ただし、バッチ・サイズを増やすと、レイテンシが増大する場合があります。最初は5など、小さな値から設定してください。この値は、アプリケーションのパフォーマンスで許容される範囲で増やすことができます。
MDBバッチ処理の使用時に、トランザクションごとに処理されるメッセージ数が増加します。これによって、各トランザクションで実行中の処理が増加するため、タイムアウトするトランザクションの数が増加することがあります。weblogic-ejb-jar.xml
のtrans-timeout-seconds
属性の値を増加させることによって、トランザクション・タイムアウトを増加できます。あるいは、次のように@TransactionTimeoutSeconds
アノテーションを使用できます。
import weblogic.javaee.TransactionTimeoutSeconds; ...; @TransactionTimeoutSeconds(value = 60); ...; public class MyMDB ...
MDBトランザクション・バッチ処理では、アプリケーション・コードを変更する必要がありません。アプリケーションに関しては、個々のメッセージは1つずつ処理されます。アプリケーション・レベルのメッセージ・リストはありません。
内部では、WebLogic Serverがバッチ処理用のトランザクションを作成します。トランザクション内のメッセージ数が、max-messages-in-transaction
によって定義されるバッチ・サイズまたはactivationConfigProperty
内の同等のプロパティと等しくなるまで、メッセージがトランザクションに追加されます。メッセージ数がmax-messages-in-transaction
に等しくなるか、またはトランザクションに追加される次のメッセージが存在しない場合、トランザクションは処理用に送信されます。図9-1を参照してください。
1つのonMessage()
呼出しが失敗すると、バッチ全体がロールバックされます。その失敗が、weblogic-ejb-jar.xml
のtrans-timeout-seconds
属性で定義されるトランザクションのタイムアウトに起因している場合、MDBコンテナはバッチ・サイズを一時的に減らし、小さなバッチでトランザクションの処理を試行します。
別の理由による失敗の場合、MDBは、失敗したバッチ内の各メッセージを個別のトランザクションとして再処理します。これによって、個々のonMessage()
呼出しによって、バッチ全体が恒久的にハングする事態を回避できます。