1

메시지를 보내고 받기 위해 다른 연결 팩토리를 사용하고 있으며, 오류가 발생한 부분 커밋 문제로 인해 문제가 발생합니다. jms:message-driven-channel-adapterreceiveConnectionFactory을 사용하여 대기열의 메시지를 수신합니다. jms:outbound-channel-adapterdeliverConnectionFactory을 사용하여 여러 메시지를 다운 스트림 대기열로 보냅니다. receiveConnectionFactoryjms:outbound-channel-adaptersession-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이 발생하지 않고 모든 것이 예상대로 작동합니다.

답변

2

나는 송수신 (receiveConnectionFactory)에 대해 하나의 연결 팩토리 만 시도하고 팔탈 커밋이 발생하지 않고 모든 것이 예상대로 작동합니다.

귀하의 경우에 적합한 방법입니다.

귀하의 두 ConnectionFactories은 해당 개체별로 다릅니다. 나머지는 모두 같은 대상 MQ 서버처럼 보입니다. 연결 팩토리 당 하나 - 당신은 확실히 하나의 ConnectionFactory 살 수없는 경우

, 당신은 JtaTransactionManager를 사용하거나 두 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

업데이트 - 두 개의 JmsTransactionManagers를 추가했습니다. 하나는 연결 팩토리 당 하나는 ChainedTransactionManager는 트랜잭션에 참여하는 것입니다. 모든 것이 예상대로 작동하고 부분 커밋도 없습니다. 솔루션을 게시 해 주셔서 감사합니다. – Selvakumar