Skip navigation

先ず、この2つのリシーバの違いは何でしょう?TransacteJmsMessageReceiverはXAトランザクションのJmsMessageを受信することができ、TransactedSingleResourceJmsMessageReceiverはSingle Resource Transactionからメッセージを受信することができますがXAからはできません。XAメッセージ・リシーバは一つの資源からのトランザクションも行うことができるので、それではなぜ何時もXAメッセージ・リシーバを使わないのでしょう?
応えは、使うことはできるのですが、性能に影響します。XAトランザクションを使うと、メッセージをポーリング(監視)します。代わりにSingle Resourceトランザクションの場合は、MessageListenerを使うことができます。

以下の手順の代わりに、

  1. トランザクションを作成。
  2. メッセージをポーリングする。
  3. メッセージが無い場合は、トランザクションをクロース(close)するか、トランザクションの処理を行う。
  4. 手順1から繰り返す。

メッセージ・リスナを使って以下を行う:

  1. 受信メッセージをリスナを使ってListenする。
  2. メッセージを受信した場合は、トランザクションを作成する。
  3. トランザクションの処理を行う。
  4. 手順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>

その他の設定はデフォルトのメッセージ・リシーバと同じです。ただし、メッセージ・リシーバに定義したリシーバを使います。

Adaptavist Theme Builder Powered by Atlassian Confluence