1

我们需要在 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 中的写入良好。为此,我们channel-transacted在 amqp 入站和session-transactedjms 出站上使用该属性。

这是正确的方法吗?

我们如何测试消息在 MQSeries 队列中写入良好(蓝色箭头)但在向 RabbitMQ 确认期间发生错误(绿色箭头)的场景?那么是否可以在 MQSeries 上回滚?并使用来自 RabbitMQ 的此消息重试。

谢谢你的帮助。

4

1 回答 1

0

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

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

你真的不需要channel-transacted这种情况;RabbitMQ 事务主要是关于向 RabbitMQ 发布消息。

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

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

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

于 2020-03-11T14:02:33.043 回答