Глобальная транзакция между AMQP Inbound и JMS Outbound - PullRequest
1 голос
/ 11 марта 2020

Нам необходимо передавать сообщения между RabbitMQ и MQSeries.

enter image description here Для этого мы используем следующую конфигурацию.


<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-transacted на исходящем jms.

Это правильный способ сделать это?

Как мы можем проверить сценарий, где сообщение хорошо написано в очереди MQSeries (синяя стрелка), но при подтверждении RabbitMQ (зеленая стрелка) возникает ошибка? Можно ли тогда откатить на MQSeries? и повторите попытку с этим сообщением от RabbitMQ.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 11 марта 2020

Нет; это невозможно; RabbitMQ не может участвовать в глобальной транзакции (JTA).

Вы получите дубликат публикации sh в MQ, и вам придется иметь дело с ним на стороне потребителя JMS.

Вы не делаете t действительно нужно channel-transacted для этого сценария; Транзакции RabbitMQ в основном касаются публикации сообщений в RabbitMQ.

Потребление сообщений не транзакционное, но отправка ack выполняется в транзакции и может быть отменена.

Нетранзакционное потребление в этом случае использования будет предоставлена ​​та же семантика, что и для транзакций.

Вы можете прочитать об ограничении транзакций RabbitMQ здесь .

...