Spring RabbitTemplate-如何在发布者确认模式下获取已发布的 NACK 消息

Spring RabbitTemplate- How to get hold of the published message for NACKs in Publisher confirm mode

我有一个使用 spring 在 RabbitQueue 上发布消息的网络应用程序。我已打开 Publisher 确认并启用 returns,并且我正在使用 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>

我的 MessagesConfirmCallback class:

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

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 的情况下获取已发布的消息?

当一条消息因为无法路由到队列而被 return 编辑时,RabbitMQ return 发送完整的消息。

当消息被确认(或取消)时,RabbitMQ 只是 return 一个序列和一个数字,不会提供整个消息。 Spring AMQP 使用该序列号来确定要 return 的相关数据。

应用程序需要在发送之前保留对消息的引用(可能在 Map 中,由 CorrelationData 中的某些内容键入,或者甚至在相关数据本身中)以便在提供相关数据时在 ack/nack 中,您可以确定它是针对哪条消息的。

当经纪人给出发布者确认时,不会返回完整的消息,而只会返回相关数据(不要将其误解为correlation_id)。开发者可以通过rabbitTemplate.send或rabbitTemplate.convertAndSend向broker发布消息时传递关联数据,传递过来的关联数据将由broker返回。并且开发人员可以制作一个以相关数据(或封装在相关数据中的 id 字段)为键的地图,或者可以存储在某个数据库中并可以从那里检索消息。