先ず、この2つのリシーバの違いは何でしょう?TransacteJmsMessageReceiverはXAトランザクションのJmsMessageを受信することができ、TransactedSingleResourceJmsMessageReceiverはSingle Resource Transactionからメッセージを受信することができますがXAからはできません。XAメッセージ・リシーバは一つの資源からのトランザクションも行うことができるので、それではなぜ何時もXAメッセージ・リシーバを使わないのでしょう?
応えは、使うことはできるのですが、性能に影響します。XAトランザクションを使うと、メッセージをポーリング(監視)します。代わりにSingle Resourceトランザクションの場合は、MessageListenerを使うことができます。
以下の手順の代わりに、
- トランザクションを作成。
- メッセージをポーリングする。
- メッセージが無い場合は、トランザクションをクロース(close)するか、トランザクションの処理を行う。
- 手順1から繰り返す。
メッセージ・リスナを使って以下を行う:
- 受信メッセージをリスナを使ってListenする。
- メッセージを受信した場合は、トランザクションを作成する。
- トランザクションの処理を行う。
- 手順1から繰り返す。
下の処理の流れの方が効率的だと分かると思います。特にメッセージが少ない場合は効率的です。
TransactedSingleResourceJmsMessageReceiverを使う場合は、デフォルトのメッセ-ジ・リシーバをオーバーライドします。具体的には、以下のように新規のJMSコネクタを作成する場合に行います:
JmsConnector connector = new JmsConnector();
Map overrides = new HashMap();
overrides.put("message.receiver", TransactedSingleResourceJmsMessageReceiver.class.getName());
overrides.put("transacted.message.receiver", TransactedSingleResourceJmsMessageReceiver.class.getName());
connector.setServiceOverrides(overrides);
XML設定ファイルにコネクタの設定を追加します:
<connector name="myJmsConnector" className="org.mule.providers.jms.JmsConnector">
<properties>
...
<map name="serviceOverrides">
<property name="message.receiver" value="org.mule.providers.jms.TransactedSingleResourceJmsMessageReceiver"/>
<property name="transacted.message.receiver" value="org.mule.providers.jms.TransactedSingleResourceJmsMessageReceiver"/>
</map>
</properties>
</connector>
その他の設定はデフォルトのメッセージ・リシーバと同じです。ただし、メッセージ・リシーバに定義したリシーバを使います。