第30章 アプリケーションサーバー統合と Java EE
HornetQ は JCA アダプターも提供するため、他の Java EE 準拠アプリケーションサーバーで HornetQ を JMS プロバイダーとして統合できます。リモート JCA アダプターを別のアプリケーションサーバーに統合する方法については、他のアプリケーションサーバーの指示を参照してください。
JCA アダプターは、基本的に Message-Driven Bean (MDB) へのメッセージのインフローと他の Java EE コンポーネント (EJB やサーブレットなど) から送信されたメッセージのアウトフローを制御します。
この項では、AS でさまざまな Java EE コンポーネントを設定する場合に背後にある基本的なことについて説明します。
30.1. Message-Driven Bean の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
HornetQ を使用した MDB へのメッセージ配信は、
JBOSS_DIST/jboss-as/server/PROFILE/deploy/jms-ra.rar/META-INF/ra.xml ファイルの JCA アダプターで設定されます。デフォルトでは、これは、アプリケーションサーバー内で実行されている HornetQ のインスタンスから InVM コネクターを使用してメッセージを消費するゆ設定されます。設定パラメーターを調整する必要がある場合、パラメーターの詳細は 「JCA アダプターの設定」 に記載されています。
HornetQ は、デフォルトのインストールで標準的な設定を提供し、MDB がリソースアダプター宛先と宛先タイプを参照できます。
JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/jms-ds.xml データソースファイルは、<rar-name> ディレクティブを使用して ra.xml ファイルの宛先および宛先タイプ設定情報をリンクします。
30.1.1. Container-Managed Transaction の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
MDB が Container-Managed Transaction (CMT) を使用している場合、メッセージの配信は、JTA トランザクションのスコープ内で行われます。このトランザクションのコミットまたはロールバックはコンテナ自体により制御されます。トランザクションがロールバックされると、メッセージ配信セマンティクスが有効になります (デフォルトでは、DLQ への送信前にメッセージを最大 10 回再配信しようとします)。アノテーションを使用する場合、これは以下のように設定されます。
TransactionManagement アノテーションは、コンテナがトランザクションを管理するよう指示します。TransactionAttribute アノテーションは、この MDB に対して JTA が必要であることをコンテナに伝えます。これに対する他の有効な値は TransactionAttributeType.NOT_SUPPORTED であり、この MDB が JTA トランザクションをサポートせず、トランザクションを作成すべきでないことをコンテナに伝えます。
また、
MessageDrivenContext の setRollbackOnly を呼び出すことにより、トランザクションをロールバックする必要があることをコンテナに通知することができます。このコードは以下のようになります。
作成される XA トランザクションのオーバーヘッドを必要とせず、トランザクション内で配信されたメッセージが必要な場合 (JMS リソースのみを使用している場合など) は、ローカルトランザクションを使用するよう MDB を設定できます。これは以下のように設定されます。
30.1.2. Bean-Managed Transaction の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Message-Driven Bean は、Bean-Managed Transaction (BMT) を使用するよう設定することもできます。この場合は、ユーザートランザクションが作成されます。これは、以下のように設定されます。
Bean-Managed Transaction を使用している場合、MDB へのメッセージ配信はユーザートランザクションのスコープ外で行われ、ユーザーによって
acknowledgeMode プロパティーで指定された承認モードを使用します。この Auto-acknowledge と Dups-ok-acknowledge には 2 つの許容値しかありません。メッセージ配信はトランザクションのスコープ外で行われるため、MDB 内で障害が発生するとメッセージが再配信されません。
ユーザーはトランザクションのライフサイクルを以下のように制御します。
30.1.3. Message-Driven Bean でのメッセージセレクターの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
また、メッセージセレクターで MDB を使用することもできます。これを行うには、以下のようにメッセージセレクターを定義します。
30.1.4. Message-Driven Bean の高可用性 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Message-Driven Bean が高可用性 (HA) 環境と互換性を持つようにするには、Bean で HA んい関連する @ActivationConfigProperty を設定する必要があります。
重要
デフォルトでクラスタリングに対してすべてのサーバープロファイルが有効になるわけではありません。<clustered>true</clustered> ディレクティブが
JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xml で設定されていることを確認します。<clustered> ディレクティブが適切に指定されていない場合に、アクティベーションプロパティーにより、HornetQException がスローされます。クラスタリングの詳細については、36章クラスター を参照してください。
アクティベーションプロパティーを Bean の
activationConfig ブロックに追加して MDB が HA 環境と互換性を持つようにします。
activationConfig =
{
@ActivationConfigProperty
(propertyName = "hA", propertyValue = "true"),
}
activationConfig =
{
@ActivationConfigProperty
(propertyName = "hA", propertyValue = "true"),
}
高可用性の詳細については、37章高可用性およびフェイルオーバー を参照してください。