私はメッセージの送受信にさまざまな接続ファクトリを使用していますが、デリケーなエラーが発生した場合には部分的なコミットの問題が発生します。 jms:message-driven-channel-adapter
は、receiveConnectionFactory
を使用してキューからのメッセージを受信します。 jms:outbound-channel-adapter
は、deliverConnectionFactory
を使用して、メッセージを複数のダウンストリームキューに送信します。 receiveConnectionFactory
とjms: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
)を試しましたが、致命的なコミットは起こっていません。すべて正常に動作します。
おかげで迅速な応答を@Artem。はい、今私たちは受信と送信のために同じQManagerに接続されています。私たちは、送信と受信のために異なるQManagerを将来実装する準備をしています。私はJtaTransactionManagerまたはChainedTransactionManagerの実装を試み、問題が解決するかどうかを確認します。 – Selvakumar
更新 - 2つのJmsTransactionManagersを追加しました.1つは接続ファクトリごと、もう1つはChainedTransactionManagerによってトランザクションに追加されます。すべてが期待通りに機能し、部分コミットはありません。解決策を投稿するための@artemに感謝します。 – Selvakumar