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