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

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

    <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>

Класс My 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?


person ignatan    schedule 07.12.2015    source источник


Ответы (2)


Когда сообщение возвращается из-за того, что его нельзя перенаправить в очередь, RabbitMQ возвращает полное сообщение.

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

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

person Gary Russell    schedule 07.12.2015
comment
Есть ли способ получить данные корреляции из ReturnCallback? - person Konstantin Zyubin; 26.02.2020

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

person jatin goel    schedule 10.11.2016
comment
да, но как получить данные корреляции из ReturnCallback? - person Konstantin Zyubin; 26.02.2020
comment
Не задавайте новых вопросов по старым ответам; особенно старые. Ответ отрицательный, но предпочтительный способ сделать это сейчас - использовать подтверждения; теперь есть ListenableFuture в CorrelationData, который вы можете подождать (или добавить слушателя), а возвращенное сообщение (если есть) добавляется к данным корреляции. См. документацию . >In addition, when both confirms and returns are enabled, the CorrelationData is populated with the returned message. It is guaranteed that this occurs before the fut... - person Gary Russell; 26.02.2020