Spring RabbitTemplate- Как получить опубликованное сообщение для NACK в режиме подтверждения Publisher

У меня есть веб-приложение, которое отправляет сообщения на RabbitQueue с помощью Spring. Я включил Publisher, подтвердил и включил возврат, и я использую шаблон весны кролика:. Это моя конфигурация:

    <rabbit:template id="amqpTemplate" connection-factory="amqpConnectionFactory" retry-template="retryTemplate" confirm-callback="messagesConfirmCallback" return-callback="messagesReturnCallback"   
    exchange="${rabbitmq.rest.exchange}" routing-key="key.listener" mandatory="true" />

<rabbit:connection-factory id="amqpConnectionFactory" publisher-confirms="true" publisher-returns="true"  connection-factory="secureClientConnectionFactory" />

<bean id="messagesConfirmCallback" class="com.test.message.MessagesConfirmCallback" />
<bean id="messagesReturnCallback" class="com.test.message..MessagesReturnCallback" />

<bean id="secureClientConnectionFactory" class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean"  >
    <property name="uri" value="${mq.uri}" />
</bean>

Мой класс MessagesConfirmCallback:

public class MessagesConfirmCallback implements RabbitTemplate.ConfirmCallback {

    private static final Log LOGGER = LogFactory.getLog(MessagesConfirmCallback.class);

    @Override
    public void confirm(CorrelationData correlationData, boolean ack,
            String cause) {
        if(ack){
             LOGGER.info("ACK received");
        }
        else{
            LOGGER.info("NACK received");
        }       
    }
}

и класс MessageReturnCallback:

public class MessageReturnCallback implements RabbitTemplate.ReturnCallback {

    private static final Log LOGGER = LogFactory.getLog(MessagesReturnCallback.class);


    @Override
    public void returnedMessage(Message message, int replyCode,
            String replyText, String exchange, String routingKey) {

        LOGGER.info("Message: " + message.getBody());

    }
}

Я могу видеть, что MessageReturnCallback.returnedMessage вызывается (и там с помощью опубликованной полезной нагрузки) в случаях, когда публикация успешна и ACK получен, но не в случае NACK. Есть ли способ получить опубликованное сообщение в случае NACK?

2 ответа

Решение

Когда сообщение возвращается, поскольку оно не может быть перенаправлено в очередь, RabbitMQ возвращает полное сообщение.

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

Прикладная программа должна сохранять ссылку на сообщение перед отправкой (возможно, на карте, под ключом чего-то в CorrelationDataили даже в самих данных корреляции), чтобы при предоставлении данных корреляции в ack/nack вы могли определить, для какого сообщения оно предназначено.

Когда посредник дает подтверждение издателя, полное сообщение не возвращается, а только корреляционные данные возвращаются (не интерпретируйте его как correlation_id). Разработчик может передать данные корреляции при публикации сообщения брокеру через rabbitTemplate.send или rabbitTemplate.convertAndSend, и переданные данные корреляции будут отправлены брокером обратно. Кроме того, разработчик может создать карту, основанную на корреляционных данных (или поле идентификатора, инкапсулированных в корреляционные данные), или сохранить в какой-либо базе данных и получить оттуда сообщение.

Другие вопросы по тегам