31.7. 汎用 Jakarta メッセージングリソースアダプターのデプロイ

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

重要

汎用 Jakarta Messaging リソースアダプターを使用する前に、Jakarta Messagingf プロバイダーについて、JBoss EAP と一緒に使用できる固有のリソースアダプターがあるかどうかを確認します。汎用 Jakarta Messaging Jakarta Connectors リソースアダプターは、Jakarta Messaging プロバイダーが独自のリソースアダプターを提供しない場合にのみ使用してください。

汎用リソースアダプターを設定する前に、以下を行う必要があります。

  • Jakarta Messaging プロバイダーサーバーが設定されており、使用できる状態である必要があります。プロバイダーの JMS Messaging 実装に必要なバイナリーが必要になります。
  • 接続ファクトリー、キュー、トピックなどの Jakarta Messaging リソースを検索できるようにするには、以下の Jakarta Messaging プロバイダープロパティーの値を知る必要があります。

    • java.naming.factory.initial
    • java.naming.provider.url
    • java.naming.factory.url.pkgs

この手順で使用する XML の例では、これらのパラメーターはそれぞれ、PROVIDER_FACTORY_INITIALPROVIDER_URLPROVIDER_CONNECTION_FACTORY として記述されています。これらのプレースホルダーを、お使いの環境の Jakarta Messaging の値に置き換えてください。

31.7.1. サードパーティー Jakarta メッセージングプロバイダーで使用する汎用 Jakarta Messaging リソースアダプターの設定

  1. リソースアダプターモジュールを作成および設定します。

    Jakarta Messaging プロバイダーへの接続および通信に必要なすべてのライブラリーが含まれる JBoss EAP モジュールを作成します。このモジュールの名前は org.jboss.genericjms.provider です。

    • 以下のディレクトリー構造を作成します。EAP_HOME/modules/org/jboss/genericjms/provider/main
    • プロバイダーの Jakarta Messaging 実装に必要なバイナリーを EAP_HOME/modules/org/jboss/genericjms/provider/main にコピーします。

      注記

      Tibco EMS の場合、必要なバイナリーは、Tibco インストールの lib ディレクトリーにある tibjms .jartibcrypt.jar です。

    • 以下のように、EAP_HOME/modules/org/jboss/genericjms/provider/mainmodule.xml ファイルを作成し、前の手順の JAR ファイルをリソースとして表示します。

      <module xmlns="urn:jboss:module:1.5" name="org.jboss.genericjms.provider">
        <resources>
          <!-- all jars required by the Jakarta Messaging 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>
    • 以下の CLI コマンドを使用して ee サブシステムにモジュールを追加します。

      /subsystem=ee:list-add(name=global-modules, value={"name" => "org.jboss.genericjms.provider", "slot" =>"main"}
  2. Jakarta Messaging プロバイダーに対して Java Naming and Directory Interface 外部コンテキストを作成および設定します。

    接続ファクトリーや宛先などの Jakarta Messaging リソースは、Jakarta Messaging プロバイダーでルックアップされます。JBoss EAP インスタンスに外部コンテキストを追加し、このリソースのローカルルックアップがリモート Jakarta Messaging プロバイダー上のリソースを自動的に検索できるようにします。

    注記

    この手順では、EAP_HOME/standalone/configuration/standalone-full.xml を JBoss EAP 設定ファイルとして使用します。

    管理 CLI を使用して外部の Java Naming and Directory Interface コンテキストを作成し、その設定プロパティーを追加します。以下の例のプロパティーは、リモート Jakarta Messaging プロバイダーに接続するために正しい値に置き換える必要があります。たとえば、Tibco EMS などの Jakarta Messaging プロバイダーは Java Naming and Directory Interface lookup(Name) メソッドをサポートしません。このような場合、この問題を回避するには、値が trueorg.jboss.as.naming.lookup.by.string プロパティーを追加します。必要なプロパティーとその値に関する情報は、アダプターのドキュメントを参照してください。

    /subsystem=naming/binding="java:global/remoteJMS":add(binding-type=external-context,module=org.jboss.genericjms.provider,class=javax.naming.InitialContext,environment=[java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory,java.naming.provider.url=tcp://<hostname>:7222,org.jboss.as.naming.lookup.by.string=true])

    外部コンテキストが適切に設定された状態で、java:global/remoteJMS/ で始まるリソースへの Java Naming and Directory Interface ルックアップはリモート Jakarta Messaging プロバイダーで実行されます。たとえば、メッセージ駆動 Bean が java:global/remoteJMS/Queue1 の Java Naming and Directory Interface ルックアップを実行する場合、外部コンテキストは、リモート Jakarta Messaging プロバイダーに接続し、Queue1 リソースのルックアップを実行します。

    Java Naming and Directory Interface 名を検索する際に、external-context を使用せずにリモートサーバーへの Java Naming and Directory Interface ルックアップを行うことができます。これを実行するには、以下の例にあるように CLI を使用して external-context を参照する新しいバインディングを作成します。

    /subsystem=naming/binding=java\:\/jms\/queue\/myQueue:add(binding-type=lookup, lookup=java:global/remoteJMS/jms/queue/myQueue)

    上記の例では、java:/jms/queue/myQueue の Java Naming and Directory Interface ルックアップを実行するアプリケーションは、リモートサーバーの myQueue という名前のキューを見つけます。

  3. 汎用 Jakarta Messaging リソースアダプターを作成します。

    管理 CLI を使用してリソースアダプターを作成します。

    /subsystem=resource-adapters/resource-adapter=generic-ra:add(module=org.jboss.genericjms,transaction-support=XATransaction)
  4. 汎用 Jakarta Messaging リソースアダプターを設定します。

    管理 CLI を使用してリソースアダプターの connection-definition とその他の要素を設定します。

    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=tibco-cd:add(class-name=org.jboss.resource.adapter.jms.JmsManagedConnectionFactory, jndi-name=java:/jms/XAQCF)
    
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=tibco-cd/config-properties=ConnectionFactory:add(value=XAQCF)
    
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=tibco-cd/config-properties=JndiParameters:add(value="java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://<hostname>:7222")
    
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=tibco-cd:write-attribute(name=security-application,value=true)
  5. 汎用リソースアダプターを使用するように ejb3 サブシステムのデフォルトのメッセージ駆動 Bean プールを設定します。

    /subsystem=ejb3:write-attribute(name=default-resource-adapter-name, value=generic-ra)

汎用 Jakarta Messaging リソースアダプターが設定され、使用できる状態になりました。以下は、新しいメッセージ駆動 Bean を作成する際にリソースアダプターを使用する例です。

例: 汎用リソースアダプターを使用したコード

@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = {
  // The generic Jakarta Messaging resource adapter requires the  Java Naming and Directory Interface 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 Jakarta Messaging provider.
  }
}

重要

汎用 Jakarta Messaging リソースアダプターを使用する場合は、潜在的な NullPointerException エラーを回避するために、必ずセッションが処理されるように設定してください。このエラーが発生するのは、Jakarta EE 仕様で、パラメーターが処理されないことが示されているとき、汎用 Jakarta Messaging リソースアダプターがパラメーターの処理を試みるためです。これは、connection.createSession(true, Session.SESSION_TRANSACTED); を実行して達成できます。

プールされた接続ファクトリーをリソースアダプターから使用することもできます。

@Resource(lookup = "java:/jms/XAQCF")
private ConnectionFactory cf;

外部コンテキストから直接リソースを挿入することはできませんが、外部コンテキストを挿入してからルックアップを実行することはできます。たとえば、Tibco EMS ブローカーにデプロイされたキューのルックアップは以下のようになります。

@Resource(lookup = "java:global/remoteJMS")
private Context context;
...
Queue queue = (Queue) context.lookup("Queue1")