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 実装に必要なバイナリーが必要になります。
- また、JMS リソース(接続ファクトリー、キュー、トピック)を検索することができるように、以下の JMS プロバイダープロパティーの値を知る必要があります。
- java.naming.factory.initial
- java.naming.provider.url
- java.naming.factory.url.pkgs
この手順で使用する XML の例では、これらのパラメーターはそれぞれ、PROVIDER_FACTORY_INITIAL
、PROVIDER_URL
、PROVIDER_CONNECTION_FACTORY
として記述されています。これらのプレースホルダーを、お使いの環境の JMS プロバイダーの値に置き換えてください。
手順22.10 サードパーティー JMS プロバイダーで使用する汎用 JMS リソースアダプターの設定
JMS プロバイダーの JBoss モジュールの作成
JMS プロバイダーへの接続および通信に必要なすべてのライブラリーが含まれる JBoss モジュールを作成します。このモジュールの名前はorg.jboss.genericjms.provider
です。EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
というディレクトリー構造を作成します。- プロバイダーの JMS 実装に必要なバイナリーを
EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
にコピーします。注記Tibco EMS の場合、必要なバイナリーは、Tibco インストールのlib
ディレクトリーにあるtibjms
ibcrypt.jar です。.jar
および t - 以下のように、
EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
にmodule.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>
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 プロバイダーに接続するために正しい値に置き換える必要があります。プレースホルダーテキストを置き換えて${}
をそのまま維持する場合は注意が必要です。文字列によるルックアップの有効化
JNDIlookup(Name)
メソッドをサポートしない JMS プロバイダー(Tibco EMS など)がいくつかあります。このような場合、この問題を回避するには、値がtrue
のorg.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
リソースのルックアップを実行します。汎用 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>
デフォルトのメッセージ駆動 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. } }
NullPointerException
(NPE)エラーを回避するために、必ずセッションが機能するように設定してください。NPE エラーが発生するのは、Java EE 仕様でパラメーターが処理され ない ことが示されているとき、汎用 JMS リソースアダプターがパラメーターの処理を試みるためです。
connection.createSession(true, Session.SESSION_TRANSACTED);
例22.5 プール接続の使用
@Resource(lookup = "java:/jms/XAQCF") private ConnectionFactory cf;
例22.6 ルックアップの実行
@Resource(lookup = "java:global/remoteJMS") private Context context; ... Queue queue = (Queue) context.lookup("Queue1")