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 字段)为键的地图,或者可以存储在某个数据库中并可以从那里检索消息。
我有一个使用 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 字段)为键的地图,或者可以存储在某个数据库中并可以从那里检索消息。