2.3. camel-jms プロジェクトの説明
Camel ルートは以下のエンドポイント URI を使用します。
<route id="file-to-jms-route">
...
<to uri="jms:queue:incomingOrders?transacted=true" />
</route>
<route id="jms-cbr-route">
<from uri="jms:queue:incomingOrders?transacted=true" />
...
</route>
jms コンポーネントは、以下のスニペットを使用して設定されます。
<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>
transactionManager の参照は次のとおりです。
<reference id="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
ご覧のとおり、JMS 接続ファクトリーと PlatformTransactionManager の Spring インターフェイスの両方が参照のみです。Blueprint XML で 定義 する必要はありません。これらの サービス は、Fuse 自体で公開されます。
javax.jms.ConnectionFactory が etc/org.ops4j.connectionfactory-amq7.cfg を使用して作成されたことはすでに確認できました。
トランザクションマネージャーは、以下のようになります。
karaf@root()> service:list org.springframework.transaction.PlatformTransactionManager
[org.springframework.transaction.PlatformTransactionManager]
------------------------------------------------------------
service.bundleid = 21
service.id = 527
service.scope = singleton
Provided by :
Red Hat Fuse :: Fuse Modules :: Transaction (21)
Used by:
Red Hat Fuse :: Quickstarts :: camel-jms (256)
実際のトランザクションマネージャーが登録されている他のインターフェイスを確認します。
karaf@root()> headers 21
Red Hat Fuse :: Fuse Modules :: Transaction (21)
------------------------------------------------
...
Bundle-Name = Red Hat Fuse :: Fuse Modules :: Transaction
Bundle-SymbolicName = fuse-pax-transx-tm-narayana
Bundle-Vendor = Red Hat
...
karaf@root()> bundle:services -p 21
Red Hat Fuse :: Fuse Modules :: Transaction (21) provides:
----------------------------------------------------------
objectClass = [org.osgi.service.cm.ManagedService]
service.bundleid = 21
service.id = 519
service.pid = org.ops4j.pax.transx.tm.narayana
service.scope = singleton
----
objectClass = [javax.transaction.TransactionManager]
provider = narayana
service.bundleid = 21
service.id = 520
service.scope = singleton
----
objectClass = [javax.transaction.TransactionSynchronizationRegistry]
provider = narayana
service.bundleid = 21
service.id = 523
service.scope = singleton
----
objectClass = [javax.transaction.UserTransaction]
provider = narayana
service.bundleid = 21
service.id = 524
service.scope = singleton
----
objectClass = [org.jboss.narayana.osgi.jta.ObjStoreBrowserService]
provider = narayana
service.bundleid = 21
service.id = 525
service.scope = singleton
----
objectClass = [org.ops4j.pax.transx.tm.TransactionManager]
provider = narayana
service.bundleid = 21
service.id = 526
service.scope = singleton
----
objectClass = [org.springframework.transaction.PlatformTransactionManager]
service.bundleid = 21
service.id = 527
service.scope = singleton
トランザクションマネージャーは、以下のインターフェイスから利用できます。
-
javax.transaction.TransactionManager -
javax.transaction.TransactionSynchronizationRegistry -
javax.transaction.UserTransaction -
org.jboss.narayana.osgi.jta.ObjStoreBrowserService -
org.ops4j.pax.transx.tm.TransactionManager -
org.springframework.transaction.PlatformTransactionManager
これらは、必要なコンテキストから任意のものを使用できます。たとえば、camel-jms では、org.apache.camel.component.jms.JmsConfiguration.transactionManager フィールドを初期化する必要があります。これが、この例で以下が使用される理由です。
<reference id="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
以下などは使用されません。
<reference id="transactionManager" interface="javax.transaction.TransactionManager" />