異なるバージョンのJMS仕様書に対応したJMS実装を繋げることができます。 繋げるにはJMSコネクタを2つ定義します。JMSサーバ毎にコネクタを定義して、受信エンドポイントをその一つのJMSコネクタを使うように設定して、送信エンドポイントをもう一つのコネクタを利用するように設定します。次の例ではOpenJmsとActiveMQを繋ぎます。OpenJmsはJMS 1.0.2bに準拠して、ActiveMQはJMS 1.1に準拠しています。
<mule-configuration id="jmsBridge" version="1.0">
<connector name="openJmsConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
<property name="connectionFactoryJndiName" value="JmsQueueConnectionFactory"/>
<property name="jndiInitialFactory" value="org.exolab.jms.jndi.InitialContextFactory"/>
<property name="jndiProviderUrl" value="tcp://localhost:3035"/>
<property name="specification" value="1.0.2b"/>
</properties>
</connector>
<connector name="activeMQConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
<property name="connectionFactoryJndiName" value="ConnectionFactory"/>
<property name="jndiInitialFactory" value="org.activemq.jndi.ActiveMQInitialContextFactory"/>
<property name="specification" value="1.1"/>
<map name="connectionFactoryProperties">
<property name="brokerURL" value="tcp://localhost:61616"/>
</map>
</properties>
</connector>
....
</mule-configuration>
次に、設定したコネクタを利用する受信エンドポイントと送信エンドポイントの2つエンドポイントを設定します。
<global-endpoints>
<endpoint name="openJmsInbound" address="jms://test.in" connector="openJmsConnector"/>
<endpoint name="activeMQOutbound" address="jms://test.out" connector="activeMQConnector"/>
</global-endpoints>
最後に、 openJmsInbound エンドポイントに受信して、 activeMQOutbound エンドポイントにイベントを直接送信するBridgeコンポーネントを定義します。
<mule-descriptor name="jmsBridgeComponent"
implementation="org.mule.components.simple.BridgeComponent">
<inbound-router>
<global-endpoint name="openJmsInbound"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<global-endpoint name="activeMQOutbound"/>
</router>
</outbound-router>
</mule-descriptor>
トランザクション
JMSを繋ぐのにESB Muleを利用する特徴は、トランザクション対応にする場合でもXAトランザクションを定義しなくてもよいことです。XAトランザクションは煩わしく、性能を低下させます。トランザクション対応にする場合は、受信エンドポイントにJMSローカル・トランザクションを使います。ESB Muleはデフォルトの設定でJMSメッセージを送信JMSに正常に書き出した場合のみにコメットします。正常でない場合はロールバックします。Bridgeをトランザクション対応にするには、受信エンドポイントをトランザクション対応にするだけです。
<mule-descriptor name="jmsBridgeComponent"
implementation="org.mule.components.simple.BridgeComponent">
<inbound-router>
<global-endpoint name="openJmsInbound"/>
<transaction action="ALWAYS_BEGIN"
factory="org.mule.providers.jms.JmsTransactionFactory"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<global-endpoint name="activeMQOutbound"/>
</router>
</outbound-router>
</mule-descriptor>