24.10. サードパーティー JMS プロバイダーを使用するよう汎用 JMS リソースアダプターを設定

概要

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

重要

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

この手順では、JMS プロバイダーサーバーは設定済みで、使用できる状態であることを前提としています。プロバイダーの JMS 実装に必要なバイナリーがすべて必要になります。また、以下の JMS プロバイダープロパティーの値を知っている必要があります。

  • PROVIDER_HOST:PROVIDER_PORT: JMS プロバイダーサーバーのホスト名およびポート番号。
  • PROVIDER_CONNECTION_FACTORY: JMS プロバイダーサーバーにデプロイされた接続ファクトリーの名前。XA である必要があります。
  • PROVIDER_QUEUEPROVIDER_TOPIC: 使用される JMS プロバイダーサーバーのキューおよびトピックの名前。

手順24.10 汎用 JMS リソースアダプターの設定

  1. キューおよびトピックの JNDI バインディング向けに ObjectFactory 実装を作成します。
    1. 以下のコードをテンプレートとして使用し、サーバーの詳細を実際の JMS プロバイダーサーバーの値に置き換えます。
      import java.util.Hashtable;
      import java.util.Properties;
       
      public class RemoteJMSObjectFactory implements ObjectFactory {
       
        private Context context = null;
       
        public RemoteJMSObjectFactory() {
        }
       
        public Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable<?, ?> environment) throws Exception {
          try {
            String jndi = (String) obj;
       
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
            env.put(Context.URL_PKG_PREFIXES, "com.tibco.tibjms.naming");
            env.put(Context.PROVIDER_URL, "tcp://TIBCO_HOST:TIBCO_PORT");
       
            context = new InitialContext(env);
            Object o = context.lookup(jndi);
       
            return o;
          } catch (NamingException e) {
            e.printStackTrace();
            throw e;
          }
        }
      }
    2. 上記のコードをコンパイルし、結果となるクラスファイルを remoteJMSObjectFactory.jar という名前の JAR ファイルに保存します。
  2. JBoss EAP 6 インスタンスの genericjms モジュールを作成します。
    1. EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main というディレクトリー構造を作成します。
    2. remoteJMSObjectFactory.jar ファイルを EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main にコピーします。
    3. プロバイダーの JMS 実装に必要なバイナリーを EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main にコピーします。Tibco EMS では、必要なバイナリーは Tibco インストールの /lib ディレクトリーにある tibjms.jar および tibcrypt.jar になります。
    4. 下記のように module.xml ファイルを EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main に作成し、以前の手順の JAR ファイルをリソースとしてリストします。
      <module xmlns="urn:jboss:module:1.1" name="org.jboss.genericjms.provider"> 
        <resources> 
            <resource-root path="tibjms.jar"/> 
            <resource-root path="tibcrypt.jar"/>
            <resource-root path="remoteJMSObjectFactory.jar"/>
        </resources> 
      
         <dependencies> 
            <module name="javax.api"/> 
            <module name="javax.jms.api"/> 
        </dependencies> 
      </module>
  3. グローバルモジュールとするすべてのデプロイメントに対し、汎用 JMS モジュールを依存関係として追加します。

    注記

    この手順では、EAP_HOME/standalone/configuration/standalone-full.xml が JBoss EAP 6 設定ファイルとして使用されます。
    EAP_HOME/standalone/configuration/standalone-full.xml にて、<subsystem xmlns="urn:jboss:domain:ee:1.1"> の下に以下を追加します。
    <global-modules>
      <module name="org.jboss.genericjms.provider" slot="main"/>
      <module name="org.jboss.common-core" slot="main"/>
    </global-modules>
  4. デフォルトの HornetQ リソースアダプターを汎用リソースアダプターに置き換えます。
    EAP_HOME/standalone/configuration/standalone-full.xml<subsystem xmlns="urn:jboss:domain:ejb3:1.4"> <mdb> を以下に置き換えます。
    <mdb>
      <resource-adapter-ref resource-adapter-name="org.jboss.genericjms"/>
      <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
    </mdb>
  5. 必要に応じて、JMS トピックおよびキューのバインディングをリモートオブジェクトとして追加します。
    EAP_HOME/standalone/configuration/standalone-full.xml にて、<subsystem xmlns="urn:jboss:domain:naming:1.3"> の下にバインディングを追加し、必要に応じて PROVIDER_QUEUE および PROVIDER_TOPIC を置き換えます。
    <bindings>
      <object-factory name="PROVIDER_QUEUE" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
      <object-factory name="PROVIDER_TOPIC" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
    </bindings>
  6. EAP_HOME/standalone/configuration/standalone-full.xml にて、汎用リソースアダプターを <subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"> に追加します。
    PROVIDER_CONNECTION_FACTORYPROVIDER_HOST、および PROVIDER_PORT を JMS プロバイダーの値に置き換えます。
    <resource-adapters>
      <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/PROVIDER_CONNECTION_FACTORY" pool-name="PROVIDER_CONNECTION_FACTORY">
            <config-property name="JndiParameters">
              java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT
            </config-property>
            <config-property name="ConnectionFactory">
              PROVIDER_CONNECTION_FACTORY
            </config-property>
            <security>
              <application/>
            </security>
          </connection-definition>
        </connection-definitions>
      </resource-adapter>
    </resource-adapters>
結果

汎用 JMS リソースアダプターが設定され、使用できる状態になりました。

新しいメッセージ駆動型 Bean (MDB) を作成するとき、以下のようなコードを使用し、リソースアダプターを使用します。PROVIDER_CONNECTION_FACTORYPROVIDER_HOST、および PROVIDER_PORT を JMS プロバイダーの値に置き換えます。
オプションとして、以下のように user および password プロパティーを指定して (必要に応じてプロパティーの値を置き換えます) Tibco EMS のセキュアな接続を設定することもできます。
@MessageDriven(activationConfig = { 
  @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
  @ActivationConfigProperty(propertyName = "jndiParameters", propertyValue = "java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT")
  @ActivationConfigProperty(propertyName = "destination", propertyValue = "PROVIDER_QUEUE"), 
  @ActivationConfigProperty(propertyName = "connectionFactory", propertyValue = "PROVIDER_CONNECTION_FACTORY"),
  @ActivationConfigProperty(propertyName = "user", propertyValue = "USER"),
  @ActivationConfigProperty(propertyName = "password", propertyValue = "PASSWORD"),
})

@ResourceAdapter("org.jboss.genericjms")
public class SampleMdb implements MessageListener { 
  @Override

    public void onMessage(Message message) { 
    
    } 

}