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.ConnectionFactoryetc/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" />