如何连接来自两个不同连接工厂的SpringJMS事务?

如何连接来自两个不同连接工厂的SpringJMS事务?,spring,transactions,spring-integration,spring-transactions,spring-jms,Spring,Transactions,Spring Integration,Spring Transactions,Spring Jms,我使用不同的连接工厂来发送和接收消息,在delivey失败时遇到部分提交问题jms:message-driven channel adapter使用receiveConnectionFactoryro从队列接收消息jms:outbound channel adapter使用deliverConnectionFactory将消息多个发送到下游队列。我们只有一个jmtransactionmanager,它使用receiveConnectionFactory和jms:outbound channel适

我使用不同的连接工厂来发送和接收消息,在delivey失败时遇到部分提交问题
jms:message-driven channel adapter
使用
receiveConnectionFactory
ro从队列接收消息
jms:outbound channel adapter
使用
deliverConnectionFactory
将消息多个发送到下游队列。我们只有一个
jmtransactionmanager
,它使用
receiveConnectionFactory
jms:outbound channel适配器
配置为
session transact=“true”


当任何一个目标上存在MQ异常时,会发生部分提交,然后发生故障队列提交。我正在查看是否缺少一些用于加入事务的配置,以便不会发生部分提交

我尝试了只使用一个连接工厂进行发送和接收(
receiveConnectionFactory
),但没有进行并行提交,一切都按预期进行

我尝试了只使用一个连接工厂进行发送和接收(
receiveConnectionFactory
),但没有进行并行提交,一切都按预期进行

对你来说,这是正确的方法

我发现您的两个
连接工厂
只是对象不同而已。rest的所有内容看起来都是相同的目标MQ服务器

如果你不能只使用一个代码>连接工厂[/COD],你应该考虑使用<代码> JTATRAN ActhMaungSux/Corp>或者配置<代码> org .prgFrrask.Diga.Trase.ChaneDeTraceActudioMeals>代码> >两个代码> JMSTRANSANS管理器< /代码> -每个连接工厂一个.< /P>


请参阅Dave Syer关于此事的文章:

感谢@Artem的快速回复。是的,现在我们连接到同一个QManager进行接收和发送。我们正在为将来的发送和接收不同的QManager的实施做准备。我将尝试实现JtaTransactionManager或ChainedTransactionManager,看看这是否解决了问题。更新-我添加了两个JMStransactionManager-每个连接工厂一个,ChainedTransactionManager加入事务。一切正常,没有部分提交。感谢@artem发布解决方案。
<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>