第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 回再配信しようとします)。アノテーションを使用する場合、これは以下のように設定されます。
@MessageDriven(name = "MDB_CMP_TxRequiredExample",
  activationConfig =
  {
    @ActivationConfigProperty
      (propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty
      (propertyName = "destination", propertyValue = "queue/testQueue")
  })
@TransactionManagement(value= TransactionManagementType.CONTAINER)
@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
public class MDB_CMP_TxRequiredExample implements MessageListener
{
   public void onMessage(Message message)...
}
Copy to Clipboard Toggle word wrap
TransactionManagement アノテーションは、コンテナがトランザクションを管理するよう指示します。TransactionAttribute アノテーションは、この MDB に対して JTA が必要であることをコンテナに伝えます。これに対する他の有効な値は TransactionAttributeType.NOT_SUPPORTED であり、この MDB が JTA トランザクションをサポートせず、トランザクションを作成すべきでないことをコンテナに伝えます。
また、MessageDrivenContextsetRollbackOnly を呼び出すことにより、トランザクションをロールバックする必要があることをコンテナに通知することができます。このコードは以下のようになります。
@Resource
   MessageDrivenContextContext ctx;

   public void onMessage(Message message)
   {
      try
      {
         //something here fails
      }
      catch (Exception e)
      {
         ctx.setRollbackOnly();
      }
   }
Copy to Clipboard Toggle word wrap
作成される XA トランザクションのオーバーヘッドを必要とせず、トランザクション内で配信されたメッセージが必要な場合 (JMS リソースのみを使用している場合など) は、ローカルトランザクションを使用するよう MDB を設定できます。これは以下のように設定されます。
@MessageDriven(name = "MDB_CMP_TxLocalExample",
  activationConfig =
  {
    @ActivationConfigProperty
      (propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty
      (propertyName = "destination", propertyValue = "queue/testQueue"),
    @ActivationConfigProperty
      (propertyName = "useLocalTx", propertyValue = "true")
  })
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
public class MDB_CMP_TxLocalExample implements MessageListener
{
   public void onMessage(Message message)...
}
Copy to Clipboard Toggle word wrap

30.1.2. Bean-Managed Transaction の使用

Message-Driven Bean は、Bean-Managed Transaction (BMT) を使用するよう設定することもできます。この場合は、ユーザートランザクションが作成されます。これは、以下のように設定されます。
@MessageDriven(name = "MDB_BMPExample",
  activationConfig =
    {
      @ActivationConfigProperty
        (propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty
        (propertyName = "destination", propertyValue = "queue/testQueue"),
      @ActivationConfigProperty
        (propertyName = "acknowledgeMode", propertyValue = "Dups-ok-acknowledge")
    })
@TransactionManagement(value= TransactionManagementType.BEAN)
public class MDB_BMPExample implements MessageListener
{
   public void onMessage(Message message)
}
Copy to Clipboard Toggle word wrap
Bean-Managed Transaction を使用している場合、MDB へのメッセージ配信はユーザートランザクションのスコープ外で行われ、ユーザーによって acknowledgeMode プロパティーで指定された承認モードを使用します。この Auto-acknowledgeDups-ok-acknowledge には 2 つの許容値しかありません。メッセージ配信はトランザクションのスコープ外で行われるため、MDB 内で障害が発生するとメッセージが再配信されません。
ユーザーはトランザクションのライフサイクルを以下のように制御します。
@Resource
  MessageDrivenContext ctx;

  public void onMessage(Message message)
  {
    UserTransaction tx;
    try
    {
      TextMessage textMessage = (TextMessage)message;
      String text = textMessage.getText();
      UserTransaction tx = ctx.getUserTransaction();
      tx.begin();
      //do some stuff within the transaction
      tx.commit();
    }
    catch (Exception e)
    {
       tx.rollback();
    }
  }
Copy to Clipboard Toggle word wrap

30.1.3. Message-Driven Bean でのメッセージセレクターの使用

また、メッセージセレクターで MDB を使用することもできます。これを行うには、以下のようにメッセージセレクターを定義します。
@MessageDriven(name = "MDBMessageSelectorExample",
  activationConfig =
    {
      @ActivationConfigProperty
        (propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty
        (propertyName = "destination", propertyValue = "queue/testQueue"),
      @ActivationConfigProperty
        (propertyName = "messageSelector", propertyValue = "color = 'RED'")
    })
@TransactionManagement(value= TransactionManagementType.CONTAINER)
@TransactionAttribute(value= TransactionAttributeType.REQUIRED)
public class MDBMessageSelectorExample implements MessageListener
{
   public void onMessage(Message message)....
}
Copy to Clipboard Toggle word wrap

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"),
    }
Copy to Clipboard Toggle word wrap
高可用性の詳細については、37章高可用性およびフェイルオーバー を参照してください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat