7.2. PAX-JMS 設定サービス
mvn:org.ops4j.pax.jms/pax-jms-config/1.0.0 バンドルは、以下の 3 つを行う Managed Service Factory を提供します。
org.ops4j.pax.jms.service.ConnectionFactoryFactoryOSGi サービスを追跡し、そのメソッドを呼び出します。public ConnectionFactory createConnectionFactory(Map<String, Object> properties); public XAConnectionFactory createXAConnectionFactory(Map<String, Object> properties);
-
org.ops4j.connectionfactoryファクトリー PID を追跡し、上記のメソッドに必要なプロパティーを収集します。Configuration Admin サービスで利用可能な方法を使用して ファクトリー設定 を作成する場合 (たとえば${karaf.etc}/org.ops4j.connectionfactory-artemis.cfgファイルを作成)、最終的な手順を実行して、データベース固有のコネクションファクトリーを公開できます。 -
javax.jms.ConnectionFactoryサービスおよびjavax.jms.XAConnectionFactoryサービスを追跡し、これらをプーリング JMS 接続ファクトリー内にラップします。
詳細は以下を参照してください。
7.2.1. AMQ 7.1 の接続ファクトリーの作成
以下は、Artemis ブローカーの接続ファクターを作成する方法を順をおって説明した 標準的 なガイドです。
pax-jms-artemis機能とpax-jms-config機能を使用して Artemis ドライバーをインストールします。karaf@root()> feature:install pax-jms-artemis karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-config OPS4J Pax JMS Config (248) provides: ------------------------------------ objectClass = [org.osgi.service.cm.ManagedServiceFactory] service.bundleid = 248 service.id = 328 service.pid = org.ops4j.connectionfactory service.scope = singleton karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-artemis OPS4J Pax JMS Artemis Support (247) provides: --------------------------------------------- objectClass = [org.ops4j.pax.jms.service.ConnectionFactoryFactory] service.bundleid = 247 service.id = 327 service.scope = singleton type = artemis
ファクトリー設定 を作成します。
karaf@root()> config:edit --factory --alias artemis org.ops4j.connectionfactory karaf@root()> config:property-set type artemis karaf@root()> config:property-set osgi.jndi.service.name jms/artemis # "name" property may be used too karaf@root()> config:property-set connectionFactoryType ConnectionFactory # or XAConnectionFactory karaf@root()> config:property-set jms.url tcp://localhost:61616 karaf@root()> config:property-set jms.user admin karaf@root()> config:property-set jms.password admin karaf@root()> config:property-set jms.consumerMaxRate 1234 karaf@root()> config:update karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)' ---------------------------------------------------------------- Pid: org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 FactoryPid: org.ops4j.connectionfactory BundleLocation: ? Properties: connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karar.etc}/org.ops4j.connectionfactory-artemis.cfg jms.consumerMaxRate = 1234 jms.password = admin jms.url = tcp://localhost:61616 jms.user = admin osgi.jndi.service.name = jms/artemis service.factoryPid = org.ops4j.connectionfactory service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 type = artemispax-jms-configが設定を処理してjavax.jms.ConnectionFactoryサービスに指定しているかどうかを確認します。karaf@root()> service:list javax.jms.ConnectionFactory [javax.jms.ConnectionFactory] ----------------------------- connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-artemis.cfg jms.consumerMaxRate = 1234 jms.password = admin jms.url = tcp://localhost:61616 jms.user = admin osgi.jndi.service.name = jms/artemis pax.jms.managed = true service.bundleid = 248 service.factoryPid = org.ops4j.connectionfactory service.id = 342 service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703 service.scope = singleton type = artemis Provided by : OPS4J Pax JMS Config (248)注記追加の Artemis 設定 (特に
protocol=amqp) を指定した場合は、Artemis JMS クライアントの代わりに QPID JMS ライブラリーが使用されます。その後、amqp://プロトコルをjms.urlプロパティーに使用する必要があります。- 接続をテストします。
これで、必要に応じて挿入できるブローカー固有の (まだプールなし) 接続ファクトリーができました。たとえば、jms 機能から Karaf コマンドを使用できます。
karaf@root()> feature:install -v jms Adding features: jms/[4.2.0.fuse-000237-redhat-1,4.2.0.fuse-000237-redhat-1] ... karaf@root()> jms:connectionfactories JMS Connection Factory ────────────────────── jms/artemis karaf@root()> jms:info -u admin -p admin jms/artemis Property │ Value ─────────┼────────────────────────── product │ ActiveMQ version │ 2.4.0.amq-711002-redhat-1 karaf@root()> jms:send -u admin -p admin jms/artemis DEV.QUEUE.1 "Hello Artemis" karaf@root()> jms:browse -u admin -p admin jms/artemis DEV.QUEUE.1 Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp ────────────────────────────────────────┼───────────────┼─────────┼──────┼────────────────┼───────────────┼────────────────────────────┼────────────┼──────────┼─────────────┼─────────┼────────────────────────────── ID:2b6ea56d-574d-11e8-971a-7ee9ecc029d4 │ Hello Artemis │ UTF-8 │ │ │ Persistent │ ActiveMQQueue[DEV.QUEUE.1] │ Never │ 4 │ false │ │ Mon May 14 10:02:38 CEST 2018
次のリストは、プロトコルを切り替えたときに何が起こるかを示しています。
karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)'
----------------------------------------------------------------
Pid: org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703
FactoryPid: org.ops4j.connectionfactory
BundleLocation: ?
Properties:
connectionFactoryType = ConnectionFactory
felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-artemis.cfg
jms.consumerMaxRate = 1234
jms.password = fuse
jms.url = tcp://localhost:61616
jms.user = fuse
osgi.jndi.service.name = jms/artemis
service.factoryPid = org.ops4j.connectionfactory
service.pid = org.ops4j.connectionfactory.965d4eac-f5a7-4f65-ba1a-15caa4c72703
type = artemis
karaf@root()> config:edit org.ops4j.connectionfactory.312eb09a-d686-4229-b7e1-2ea38a77bb0f
karaf@root()> config:property-set protocol amqp
karaf@root()> config:property-delete user
karaf@root()> config:property-set username admin # mind the difference between artemis-jms-client and qpid-jms-client
karaf@root()> config:property-set jms.url amqp://localhost:61616
karaf@root()> config:update
karaf@root()> jms:info -u admin -p admin jms/artemis
Property │ Value
─────────┼────────────────
product │ QpidJMS
version │ 0.30.0.redhat-1
karaf@root()> jms:browse -u admin -p admin jms/artemis DEV.QUEUE.1
Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp
───────────┼───────────────┼─────────┼──────┼────────────────┼───────────────┼─────────────┼────────────┼──────────┼─────────────┼─────────┼──────────────────────────────
│ Hello Artemis │ UTF-8 │ │ │ Persistent │ DEV.QUEUE.1 │ Never │ 4 │ false │ │ Mon May 14 10:02:38 CEST 20187.2.2. IBM MQ 8 または IBM MQ 9 の接続ファクトリーの作成
このセクションでは、IBM MQ 8 および IBM MQ 9 に接続する方法を説明します。pax-jms-ibmmq は関連する pax-jms バンドルをインストールしますが、ライセンス上の理由から IBM MQ ドライバーはインストールされません。
- https://developer.ibm.com/messaging/mq-downloads/ にアクセスします。
- ログインします。
- IBM MQ 8.0 Client または IBM MQ 9.0 Client など、インストールするバージョンをクリックします。
- 表示されるページの下部にあるダウンロードバージョンの表で、目的のバージョンをクリックします。
-
次のページで、接尾辞
IBM-MQ-Install-Java-Allが付けられた最新バージョンを選択します。たとえば、8.0.0.10-WS-MQ-Install-Java-Allor9.0.0.4-IBM-MQ-Install-Java-Allをダウンロードします。 - ダウンロードした JAR ファイルの内容を展開します。
bundle:installコマンドを実行します。たとえば、/home/Downloadsディレクトリーにコンテンツを展開した場合は、以下のようなコマンドを入力します。`bundle:install -s wrap:file:////home/Downloads/9.0.0.4-IBM-MQ-Install-Java-All/ibmmq9/wmq/JavaSE/com.ibm.mq.allclient.jar`.
以下のように接続ファクトリーを作成します。
pax-jms-ibmmqをインストールします。karaf@root()> feature:install pax-jms-ibmmq karaf@root()> bundle:services -p org.ops4j.pax.jms.pax-jms-ibmmq OPS4J Pax JMS IBM MQ Support (239) provides: -------------------------------------------- objectClass = [org.ops4j.pax.jms.service.ConnectionFactoryFactory] service.bundleid = 239 service.id = 346 service.scope = singleton type = ibmmq
ファクトリー設定 を作成します。
karaf@root()> config:edit --factory --alias ibmmq org.ops4j.connectionfactory karaf@root()> config:property-set type ibmmq karaf@root()> config:property-set osgi.jndi.service.name jms/mq9 # "name" property may be used too karaf@root()> config:property-set connectionFactoryType ConnectionFactory # or XAConnectionFactory karaf@root()> config:property-set jms.queueManager FUSEQM karaf@root()> config:property-set jms.hostName localhost karaf@root()> config:property-set jms.port 1414 karaf@root()> config:property-set jms.transportType 1 # com.ibm.msg.client.wmq.WMQConstants.WMQ_CM_CLIENT karaf@root()> config:property-set jms.channel DEV.APP.SVRCONN karaf@root()> config:property-set jms.CCSID 1208 # com.ibm.msg.client.jms.JmsConstants.CCSID_UTF8 karaf@root()> config:update karaf@root()> config:list '(service.factoryPid=org.ops4j.connectionfactory)' ---------------------------------------------------------------- Pid: org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 FactoryPid: org.ops4j.connectionfactory BundleLocation: ? Properties: connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:${karaf.etc}/org.ops4j.connectionfactory-ibmmq.cfg jms.CCSID = 1208 jms.channel = DEV.APP.SVRCONN jms.hostName = localhost jms.port = 1414 jms.queueManager = FUSEQM jms.transportType = 1 osgi.jndi.service.name = jms/mq9 service.factoryPid = org.ops4j.connectionfactory service.pid = org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 type = ibmmqpax-jms-configが設定を処理してjavax.jms.ConnectionFactoryサービスに指定しているかどうかを確認します。karaf@root()> service:list javax.jms.ConnectionFactory [javax.jms.ConnectionFactory] ----------------------------- connectionFactoryType = ConnectionFactory felix.fileinstall.filename = file:/data/servers/7.6.0.fuse-760025-redhat-00001/etc/org.ops4j.connectionfactory-ibmmq.cfg jms.CCSID = 1208 jms.channel = DEV.APP.SVRCONN jms.hostName = localhost jms.port = 1414 jms.queueManager = FUSEQM jms.transportType = 1 osgi.jndi.service.name = jms/mq9 pax.jms.managed = true service.bundleid = 237 service.factoryPid = org.ops4j.connectionfactory service.id = 347 service.pid = org.ops4j.connectionfactory.eee4a757-a95d-46b8-b8b6-19aa3977d863 service.scope = singleton type = ibmmq Provided by : OPS4J Pax JMS Config (237)
接続をテストします。
karaf@root()> feature:install -v jms Adding features: jms/[4.2.0.fuse-000237-redhat-1,4.2.0.fuse-000237-redhat-1] ... karaf@root()> jms:connectionfactories JMS Connection Factory ────────────────────── jms/mq9 karaf@root()> jms:info -u app -p fuse jms/mq9 Property │ Value ─────────┼──────────────────── product │ IBM MQ JMS Provider version │ 8.0.0.0 karaf@root()> jms:send -u app -p fuse jms/mq9 DEV.QUEUE.1 "Hello IBM MQ 9" karaf@root()> jms:browse -u app -p fuse jms/mq9 DEV.QUEUE.1 Message ID │ Content │ Charset │ Type │ Correlation ID │ Delivery Mode │ Destination │ Expiration │ Priority │ Redelivered │ ReplyTo │ Timestamp ────────────────────────────────────────────────────┼─────────────────────────────┼─────────┼──────┼────────────────┼───────────────┼──────────────────────┼────────────┼──────────┼─────────────┼─────────┼────────────────────────────── ID:414d512046555345514d202020202020c940f95a038b3220 │ Hello IBM MQ 9 │ UTF-8 │ │ │ Persistent │ queue:///DEV.QUEUE.1 │ Never │ 4 │ false │ │ Mon May 14 10:17:01 CEST 2018
メッセージが IBM MQ Explorer から送信されたのか、Web コンソールから送信されたのかを確認することもできます。
7.2.3. Fuse on Apache Karaf での JBossA-MQ6.3 クライアントの使用
Fuse の Software Downloads ページから Fuse quickstarts をダウンロードできます。
クイックスタート zip ファイルの内容をローカルフォルダーに展開します (例: quickstarts という名前のフォルダー)。
次に、quickstarts/camel/camel-jms の例を OSGi バンドルとしてビルドしてインストールできます。このバンドルには、メッセージを JBoss A-MQ 6.3 JMS キューに送信する Camel ルートの Blueprint XML 定義が含まれます。JBoss A-MQ 6.3 ブローカーの接続ファクトリーを作成する手順は次のとおりです。
7.2.3.1. 前提条件
- Maven 3.3.1 以降がインストールされている。
- Red Hat Fuse がマシンにインストールされている。
- JBoss A-MQ Broker 6.3 がマシンにインストールされている。
- カスタマーポータル から Fuse on Karaf クイックスタートの zip ファイルをダウンロードして展開している。
7.2.3.2. 手順
-
quickstarts/camel/camel-jms/src/main/resources/OSGI-INF/blueprint/ディレクトリーに移動します。 camel-context.xmlファイルで id="jms" のある以下の Bean を見つけます。<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory"> <reference interface="javax.jms.ConnectionFactory" /> </property> <property name="transactionManager" ref="transactionManager"/> </bean>以下のセクションを使用して、JBoss A-MQ 6.3 接続ファクトリーをインスタンス化します。
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="activemqConnectionFactory"/> <property name="transactionManager" ref="transactionManager"/> </bean> <bean id="activemqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> <property name="userName" value="admin"/> <property name="password" value="admin"/> </bean>
JBoss A-MQ 6.3 接続ファクトリーは、
tcp://localhost:61616でリッスンするブローカーに接続するよう設定されます。デフォルトでは、JBoss A-MQ は IP ポート値61616を使用します。接続ファクトリーはユーザー名/パスワードの認証情報で admin/admin を使用するよう設定されています。このユーザーがブローカーの設定で有効にされていることを確認します (または、ここでこれらの設定をブローカー設定に合わせてカスタマイズすることもできます)。-
camel-context.xmlファイルを保存します。 camel-jmsクイックスタートをビルドします。$ cd quickstarts/camel/camel-jms $ mvn install
クイックスタートが正常にインストールされた後、
$FUSE_HOME/ディレクトリーに移動し、以下のコマンドを実行して Fuse on Apache Karaf サーバーを起動します。$ ./bin/fuse
Fuse on Apache Karaf インスタンスで、
activemq-client機能とcamel-jms機能をインストールします。karaf@root()> feature:install activemq-client karaf@root()> feature:install camel-jms
camel-jmsクイックスタートバンドルをインストールします。karaf@root()> install -s mvn:org.jboss.fuse.quickstarts/camel-jms/{$fuseversion}{$fuseversion}は、ビルドした Maven アーティファクトの実際のバージョンに置き換えます (camel-jms クイックスタートの README ファイルを参照)。JBoss A-MQ 6.3ブローカーを起動します (これに JBoss A-MQ 6.3 のインストールが必要です)。別のターミナルウィンドウを開き、JBOSS_AMQ_63_INSTALLDIR ディレクトリーに移動します。$ cd JBOSS_AMQ_63_INSTALLDIR $ ./bin/amq
-
Camel ルートが起動すると、即座に
work/jms/inputディレクトリーが Fuse インストールに表示されます。このクイックスタートのsrc/main/dataディレクトリーにあるファイルを新しく作成したwork/jms/inputディレクトリーにコピーします。 しばらく待つと、
work/jms/outputディレクトリー以下に同じファイルが国別に分類されます。order1.xml, order2.xml and order4.xml in work/jms/output/others order3.xml and order5.xml in work/jms/output/us order6.xml in work/jms/output/frlog:displayを使用してビジネスロギングを確認します。Receiving order order1.xml Sending order order1.xml to another country Done processing order1.xml
7.2.4. 処理されたプロパティーの概要
Configuration Admin ファクトリー PID からのプロパティーは、関連する org.ops4j.pax.jms.service.ConnectionFactoryFactory 実装に渡されます。
ActiveMQ
org.ops4j.pax.jms.activemq.ActiveMQConnectionFactoryFactory(JMS 1.1 のみ)org.apache.activemq.ActiveMQConnectionFactory.buildFromMap()メソッドに渡されるプロパティーArtemis
org.ops4j.pax.jms.artemis.ArtemisConnectionFactoryFactoryprotocol=amqpの場合、プロパティーはorg.apache.qpid.jms.util.PropertyUtil.setProperties()メソッドに渡され、org.apache.qpid.jms.JmsConnectionFactoryインスタンスを設定します。そうでない場合は、
org.apache.activemq.artemis.utils.uri.BeanSupport.setData()がorg.apache.activemq.artemis.jms.client.ActiveMQConnectionFactoryインスタンスに対して呼び出されます。IBM MQ
org.ops4j.pax.jms.ibmmq.MQConnectionFactoryFactorycom.ibm.mq.jms.MQConnectionFactoryまたはcom.ibm.mq.jms.MQXAConnectionFactoryの Bean プロパティーが処理されます。