1

私はメッセージの送受信にさまざまな接続ファクトリを使用していますが、デリケーなエラーが発生した場合には部分的なコミットの問題が発生します。 jms:message-driven-channel-adapterは、receiveConnectionFactoryを使用してキューからのメッセージを受信します。 jms:outbound-channel-adapterは、deliverConnectionFactoryを使用して、メッセージを複数のダウンストリームキューに送信します。 receiveConnectionFactoryjms:outbound-channel-adapterを使用してsession-transacted="true"を使用するのはJmsTransactionManagerです。2つの異なる接続ファクトリからSpring JMSトランザクションに参加するにはどうすればいいですか?

<beans> 
    <bean id="transactionManager" 
     class="org.springframework.jms.connection.JmsTransactionManager"> 
     <property name="connectionFactory" ref="receiveConnectionFactory" /> 
    </bean> 
    <bean id="receiveConnectionFactory" 
     class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory"> 
      <bean class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
       <property name="hostName" value="${mq.host}" /> 
       <property name="channel" value="${mq.channel}" /> 
       <property name="port" value="${mq.port}" /> 
      </bean> 
     </property> 
     <property name="sessionCacheSize" value="${receive.factory.cachesize}" /> 
     <property name="cacheProducers" value="${receive.cache.producers.enabled}" /> 
     <property name="cacheConsumers" value="${receive.cache.consumers.enabled}" /> 
    </bean> 

    <bean id="deliverConnectionFactory" 
     class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <property name="targetConnectionFactory"> 
      <bean class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
       <property name="hostName" value="${mq.host}" /> 
       <property name="channel" value="${mq.channel}" /> 
       <property name="port" value="${mq.port}" /> 
      </bean> 
     </property> 
     <property name="sessionCacheSize" value="${send.factory.cachesize}" /> 
     <property name="cacheProducers" value="${send.cache.producers.enabled}" /> 
     <property name="cacheConsumers" value="${send.cache.consumers.enabled}" /> 
    </bean> 

    <tx:advice id="txAdviceNew" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <tx:method name="send" propagation="REQUIRES_NEW" /> 
     </tx:attributes> 
    </tx:advice> 

    <aop:config> 
     <aop:advisor advice-ref="txAdviceNew" pointcut="bean(inputChannel)" /> 
     <aop:advisor advice-ref="txAdviceNew" pointcut="bean(errorChannel)" /> 
    </aop:config> 

    <jms:message-driven-channel-adapter 
     id="mdchanneladapter" channel="inputChannel" task-executor="myTaskExecutor" 
     connection-factory="receiveConnectionFactory" destination="inputQueue" 
     error-channel="errorChannel" concurrent-consumers="${num.consumers}" 
     max-concurrent-consumers="${max.num.consumers}" max-messages-per-task="${max.messagesPerTask}" 
     transaction-manager="transactionManager" /> 

    <jms:outbound-channel-adapter 
     connection-factory="deliverConnectionFactory" session-transacted="true" 
     destination-expression="headers.get('Deliver')" explicit-qos-enabled="true" /> 
</beans> 

いずれかの宛先でMQ例外が発生すると、部分的なコミットが発生し、次に障害キューのコミットが発生します。部分的なコミットが起こらないように、トランザクションに参加するための設定が不足しているかどうかを調べたいと思っています。

私は、両方の送受信のために1つの接続ファクトリ(receiveConnectionFactory)を試しましたが、致命的なコミットは起こっていません。すべて正常に動作します。

答えて

2

すべてが期待どおりに動作しますが、私は、送信および受信の両方のための唯一の接続ファクトリ(receiveConnectionFactory)をしようとしたparitalコミット起きていません。

これはあなたのケースに入る正しい方法です。

あなたの2つのConnectionFactoriesはオブジェクトによって異なることがわかります。残りのすべては、同じターゲットMQサーバのように見えます。接続ファクトリごとに1 - あなたは間違いなく一つだけConnectionFactoryと一緒に暮らすことができない場合

、あなたはJtaTransactionManagerを使用したり、2 JmsTransactionManagersためorg.springframework.data.transaction.ChainedTransactionManagerを設定するために検討すべきです。問題の

参照デイブSyerの記事:https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

+0

おかげで迅速な応答を@Artem。はい、今私たちは受信と送信のために同じQManagerに接続されています。私たちは、送信と受信のために異なるQManagerを将来実装する準備をしています。私はJtaTransactionManagerまたはChainedTransactionManagerの実装を試み、問題が解決するかどうかを確認します。 – Selvakumar

+1

更新 - 2つのJmsTransactionManagersを追加しました.1つは接続ファクトリごと、もう1つはChainedTransactionManagerによってトランザクションに追加されます。すべてが期待通りに機能し、部分コミットはありません。解決策を投稿するための@artemに感謝します。 – Selvakumar

関連する問題