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_QUEUE、 PROVIDER_TOPIC: 使用される JMS プロバイダーサーバーのキューおよびトピックの名前。
手順24.10 汎用 JMS リソースアダプターの設定
- キューおよびトピックの JNDI バインディング向けに
ObjectFactory
実装を作成します。- 以下のコードをテンプレートとして使用し、サーバーの詳細を実際の 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; } } }
- 上記のコードをコンパイルし、結果となるクラスファイルを
remoteJMSObjectFactory.jar
という名前の JAR ファイルに保存します。
- JBoss EAP 6 インスタンスの
genericjms
モジュールを作成します。EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
というディレクトリー構造を作成します。remoteJMSObjectFactory.jar
ファイルを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.jar
およびtibcrypt.jar
になります。 - 下記のように
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>
- グローバルモジュールとするすべてのデプロイメントに対し、汎用 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>
- デフォルトの 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>
- 必要に応じて、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>
EAP_HOME/standalone/configuration/standalone-full.xml
にて、汎用リソースアダプターを<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
に追加します。PROVIDER_CONNECTION_FACTORY、PROVIDER_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_FACTORY、PROVIDER_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) { } }