Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

22.10. サードパーティー JMS プロバイダーで使用する汎用 JMS リソースアダプターの設定

概要

JBoss EAP 6 は、サードパーティーの JMS プロバイダーと連携するように設定できますが、すべての JMS プロバイダーが Java アプリケーションプラットフォームとの統合のために JMS JCA リソースアダプターを生成する訳ではありません。この手順では、JBoss EAP 6 に含まれる汎用 JMS リソースアダプターを設定して JMS プロバイダーに接続する手順を説明します。この手順では、Tibco EMS 6.3 が JMS プロバイダーの例として使用されますが、他の JMS プロバイダーでは異なる設定が必要になる場合があります。

重要
汎用 JMS リソースアダプターを使用する前に、JMS プロバイダーをチェックして、JBoss EAP 6 で使用できる独自のリソースアダプターがあるかどうかを確認します。汎用 JMS JCA リソースアダプターは、JMS プロバイダーが固有のリソースアダプターを提供していない場合にのみ使用してください。

前提条件

  • JMS プロバイダーサーバーが設定され、使用できる状態である。プロバイダーの JMS 実装に必要なバイナリーが必要になります。
  • また、JMS リソース(接続ファクトリー、キュー、トピック)を検索することができるように、以下の JMS プロバイダープロパティーの値を知る必要があります。
    • java.naming.factory.initial
    • java.naming.provider.url
    • java.naming.factory.url.pkgs
    この手順で使用する XML の例では、これらのパラメーターはそれぞれ、PROVIDER_FACTORY_INITIALPROVIDER_URLPROVIDER_CONNECTION_FACTORY として記述されています。これらのプレースホルダーを、お使いの環境の JMS プロバイダーの値に置き換えてください。

手順22.10 サードパーティー JMS プロバイダーで使用する汎用 JMS リソースアダプターの設定

  1. JMS プロバイダーの JBoss モジュールの作成

    JMS プロバイダーへの接続および通信に必要なすべてのライブラリーが含まれる JBoss モジュールを作成します。このモジュールの名前は org.jboss.genericjms.provider です。
    1. EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/mainというディレクトリー構造を作成します。
    2. プロバイダーの JMS 実装に必要なバイナリーを EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main にコピーします。
      注記
      Tibco EMS の場合、必要なバイナリーは、Tibco インストールの lib ディレクトリーにある tibjms .jar および t ibcrypt.jar です。
    3. 以下のように、EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/mainmodule.xml ファイルを作成し、以前の手順の JAR ファイルをリソースとして一覧表示します。
      <module xmlns="urn:jboss:module:1.1" name="org.jboss.genericjms.provider">
        <resources> 
          <!-- all jars required by the JMS provider, in this case Tibco -->
          <resource-root path="tibjms.jar"/> 
          <resource-root path="tibcrypt.jar"/>
        </resources> 
        <dependencies> 
          <module name="javax.api"/> 
          <module name="javax.jms.api"/> 
        </dependencies> 
      </module>
  2. JMS プロバイダーへの JNDI 外部コンテキストの設定

    JMS リソース(接続ファクトリーおよび宛先)は JMS プロバイダーで検索されます。JBoss EAP 6 インスタンスに外部コンテキストを追加し、このリソースの ローカル ルックアップがリモート JMS プロバイダー上のリソースを自動的に検索できるようにします。
    注記
    この手順では、EAP_HOME/standalone/configuration/standalone-full.xml を JBoss EAP 6 設定ファイルとして使用します。
    EAP_HOME/standalone/configuration/standalone-full.xml の < subsystem xmlns="urn:jboss:domain:naming:1.4"> の下に以下を 追加します。
    <bindings>
      <external-context name="java:global/remoteJMS/"
        module="org.jboss.genericjms.provider" 
        class="javax.naming.InitialContext">
        <environment>
          <property name="java.naming.factory.initial" value="${PROVIDER_FACTORY_INITIAL}"/>
          <property name="java.naming.provider.url" value="${PROVIDER_URL}"/>
          <property name="java.naming.factory.url.pkgs" value="${PROVIDER_URL_PKGS}"/>
        </environment>
      </external-context>
    </bindings>
    この 3 つのプロパティーの値は、リモート JMS プロバイダーに接続するために正しい値に置き換える必要があります。プレースホルダーテキストを置き換えて ${} をそのまま維持する場合は注意が必要です。
  3. 文字列によるルックアップの有効化

    JNDI lookup(Name) メソッドをサポートしない JMS プロバイダー(Tibco EMS など)がいくつかあります。このような場合、この問題を回避するには、値が trueorg.jboss.as.naming.lookup.by.string プロパティーを追加します。

    例22.2 Tibco EMS を使用した文字列によるルックアップの有効化

    Tibco EMS への external-context の完全な定義は以下のようになります。
    <bindings>
      <external-context name="java:global/remoteJMS/"
          module="org.jboss.genericjms.provider"
          class="javax.naming.InitialContext">
        <environment>
          <property name="java.naming.factory.initial" value="com.tibco.tibjms.naming.TibjmsInitialContextFactory"/>
          <property name="java.naming.provider.url" value="TIBCO_EMS_SERVER_HOST_NAME:PORT"/>
          <property name="java.naming.factory.url.pkgs" value="com.tibco.tibjms.naming"/>
          <property name="org.jboss.as.naming.lookup.by.string" value="true"/>
        </environment>
      </external-context>
    </bindings>
    この外部コンテキストでは、java:global/remoteJMS/ で始まるリソースへの JNDI ルックアップがリモート JMS プロバイダーで行われます(この接頭辞の削除後)。たとえば、メッセージ駆動 Bean が java:global/remoteJMS/Queue1 の JNDI ルックアップを実行する場合、外部コンテキストはリモート JMS プロバイダーに接続し、Queue1 リソースのルックアップを実行します。
  4. 汎用 JMS リソースアダプターの設定

    EAP_HOME/standalone/configuration/standalone-full.xml で、汎用リソースアダプター設定を < subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"> に追加します

    例22.3 Tibco EMS リソースアダプターの設定

    Tibco EMS の完全なリソースアダプター定義は以下のようになります。
    <resource-adapter id="org.jboss.genericjms">
      <module slot="main" id="org.jboss.genericjms"/>
      <transaction-support>NoTransaction</transaction-support>
      <connection-definitions>
        <connection-definition class-name="org.jboss.resource.adapter.jms.JmsManagedConnectionFactory"
          jndi-name="java:/jms/XAQCF"
          pool-name="XAQCF">
          <config-property name="ConnectionFactory">
            XAQCF
          </config-property>
          <config-property name="JndiParameters">
      java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=TIBCO_EMS_SERVER_HOST_NAME:PORT
          </config-property>
          <security>
            <application/>
          </security>
        </connection-definition>
      </connection-definitions>
    </resource-adapter>
  5. デフォルトのメッセージ駆動 Bean プールを汎用リソースアダプターで設定します。

    EAP_HOME/standalone/configuration/standalone-full.xml の < subsystem xmlns="urn:jboss:domain:ejb3:1.5"> で、以下のように < mdb> 設定を 更新します。
    <mdb>
      <resource-adapter-ref resource-adapter-name="org.jboss.genericjms"/>
      <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
    </mdb>

結果

これで、汎用 JMS リソースアダプターが設定され、使用できるようになりました。新しいメッセージ駆動 Bean を作成するときは、以下のようなコードを使用してリソースアダプターを使用します。

例22.4 汎用リソースアダプターの使用

@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = {
  // The generic JMS resource adapter requires the JNDI bindings
  // for the actual remote connection factory and destination
  @ActivationConfigProperty(propertyName = "connectionFactory", propertyValue = "java:global/remoteJMS/XAQCF"),
  @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:global/remoteJMS/Queue1"),
  @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
  @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
  public class HelloWorldQueueMDB implements MessageListener {
  public void onMessage(Message message) {
  // called every time a message is received from the `Queue1` queue on the JMS provider.
  }
}
警告
汎用 JMS リソースアダプターを使用する場合は、潜在的な NullPointerException (NPE)エラーを回避するために、必ずセッションが機能するように設定してください。NPE エラーが発生するのは、Java EE 仕様でパラメーターが処理され ない ことが示されているとき、汎用 JMS リソースアダプターがパラメーターの処理を試みるためです。
connection.createSession(true, Session.SESSION_TRANSACTED);

例22.5 プール接続の使用

プールされた接続ファクトリーをリソースアダプターから使用することもできます。
@Resource(lookup = "java:/jms/XAQCF")
private ConnectionFactory cf;

例22.6 ルックアップの実行

外部コンテキストから直接リソースを挿入することはできませんが、外部コンテキストを挿入してからルックアップを実行することはできます。たとえば、Tibco EMS ブローカーにデプロイされたキューのルックアップは以下のようになります。
@Resource(lookup = "java:global/remoteJMS")
private Context context;

...

Queue queue = (Queue) context.lookup("Queue1")