메시지를 보내고 받기 위해 다른 연결 팩토리를 사용하고 있으며, 오류가 발생한 부분 커밋 문제로 인해 문제가 발생합니다. jms:message-driven-channel-adapter
은 receiveConnectionFactory
을 사용하여 대기열의 메시지를 수신합니다. jms:outbound-channel-adapter
은 deliverConnectionFactory
을 사용하여 여러 메시지를 다운 스트림 대기열로 보냅니다. receiveConnectionFactory
및 jms:outbound-channel-adapter
을 session-transacted="true"
으로 구성한 JmsTransactionManager
중 하나만 있습니다.두 개의 다른 연결 팩토리에서 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 예외가 발생하면 부분 커밋이 발생하고 실패 대기열 커밋이 발생합니다. 부분 커밋이 발생하지 않도록 트랜잭션에 참여하기 위해 일부 구성이 누락되어 있는지 확인하려고합니다.
송수신 (receiveConnectionFactory
)에 대해 하나의 연결 팩토리 만 시도했는데 Parity Commit이 발생하지 않고 모든 것이 예상대로 작동합니다.
감사 @Artem. 예, 지금 우리는 수신 및 송신을 위해 동일한 QManager에 연결되어 있습니다. 우리는 송수신을 위해 다른 QManager를 구현할 준비를하고 있습니다. JtaTransactionManager 또는 ChainedTransactionManager를 구현하고 문제가 해결되는지 확인합니다. – Selvakumar
업데이트 - 두 개의 JmsTransactionManagers를 추가했습니다. 하나는 연결 팩토리 당 하나는 ChainedTransactionManager는 트랜잭션에 참여하는 것입니다. 모든 것이 예상대로 작동하고 부분 커밋도 없습니다. 솔루션을 게시 해 주셔서 감사합니다. – Selvakumar