Spring integration AMQP入站和JMS出站之间的全局事务

Spring integration AMQP入站和JMS出站之间的全局事务,spring-integration,spring-integration-amqp,Spring Integration,Spring Integration Amqp,我们需要在RabbitMQ和MQSeries之间传输消息 为此,我们使用以下配置 <int:channel id="channelRmqMQ"></int:channel> <int-amqp:inbound-channel-adapter channel="channelRmqMQ" queue-names=" QUEUE_OUT "

我们需要在RabbitMQ和MQSeries之间传输消息

为此,我们使用以下配置


<int:channel id="channelRmqMQ"></int:channel>

<int-amqp:inbound-channel-adapter   channel="channelRmqMQ" 
                                    queue-names=" QUEUE_OUT " 
                                    connection-factory="rabbitConnectionFactory" 
                                    auto-startup="true" 
                                    id="inboundChannelAdapter" 
                                    channel-transacted="true" 
                                    concurrent-consumers= " 1" 
                                    prefetch-count="40" 
                                    tx-size="40"
/>

<int-jms:outbound-channel-adapter   channel="channelRmqMQ" 
                                    id="jmsOut" 
                                    destination="jmsQueue" 
                                    connection-factory="connectionFactoryCaching" 
                                    delivery-persistent="true" 
                                    explicit-qos-enabled="true" 
                                    session-transacted="true" >
    <int-jms:request-handler-advice-chain>
        <ref bean="requestHandler" />
    </int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>



我们希望确认RabbitMQ队列中的消息,以防MQSeries中的写入良好。为此,我们在amqp入站和jms出站上使用属性
channel transact

这样做对吗

如果消息在MQSeries队列(蓝色箭头)中写得很好,但在确认RabbitMQ(绿色箭头)的过程中发生错误,我们如何测试这种场景?那么是否可以在MQSeries上回滚?并使用来自RabbitMQ的此消息重试


谢谢你的帮助。

不;这是不可能的;RabbitMQ无法参与全局(JTA)事务

您将获得到MQ的重复发布,并且需要在JMS使用者端处理它

对于这种情况,您实际上不需要
渠道交易
;RabbitMQ事务主要是向RabbitMQ发布消息

消息的使用不是事务性的,但是发送
ack
是在事务中完成的,可以回滚

本用例中的非事务性消费将提供与事务性消费相同的语义


您可以阅读RabbitMQ事务的限制。

否;这是不可能的;RabbitMQ无法参与全局(JTA)事务

您将获得到MQ的重复发布,并且需要在JMS使用者端处理它

对于这种情况,您实际上不需要
渠道交易
;RabbitMQ事务主要是向RabbitMQ发布消息

消息的使用不是事务性的,但是发送
ack
是在事务中完成的,可以回滚

本用例中的非事务性消费将提供与事务性消费相同的语义


您可以阅读RabbitMQ事务的限制。

我不太清楚。在
int-amqp:inbound channel adapter
中,未设置任何
确认模式(默认情况下为自动),确认消息何时发送到RabbitMQ?通道获取此消息(绿色箭头)并将其发布到MQ(橙色箭头),然后将其确认到RabbitMQ?是同一个线程处理amqp中的读取和jms中的写入吗?然后在书写完成后发送ack?是;使用直接通道(默认情况下),JMS发布在AMQP使用者线程上进行,并且在线程返回到侦听器容器时发送ack。感谢您的返回,很清楚!根据
int jms:outbound channel adapter
的定义,如果在写入MQ之后和返回通道之前发生错误(橙色箭头),将出现回滚(MQ上的删除消息),因为我们使用
会话事务处理
?通道稍后将重试,消息未从Rabbit收到?正确,但不是“稍后”,几乎立即重试(但这取决于预回迁失败的记录是下一次重新传送还是在预回迁消息之后重新传送)。我不太清楚。在
int-amqp:inbound channel adapter
中,未设置任何
确认模式(默认情况下为自动),确认消息何时发送到RabbitMQ?通道获取此消息(绿色箭头)并将其发布到MQ(橙色箭头),然后将其确认到RabbitMQ?是同一个线程处理amqp中的读取和jms中的写入吗?然后在书写完成后发送ack?是;使用直接通道(默认情况下),JMS发布在AMQP使用者线程上进行,并且在线程返回到侦听器容器时发送ack。感谢您的返回,很清楚!根据
int jms:outbound channel adapter
的定义,如果在写入MQ之后和返回通道之前发生错误(橙色箭头),将出现回滚(MQ上的删除消息),因为我们使用
会话事务处理
?通道稍后将重试,消息未从Rabbit?确认,但不是“稍后”,几乎立即重试(但这取决于预回迁,即失败的记录是下一次重新传送,还是在预回迁消息之后重新传送)。