当我们将消息发送到RabbitMQ时,如果队列不存在,消息就会丢失,而不会引发任何错误。
信息将被张贴到哪里?死队列?
发布于 2017-05-25 13:40:12
这就是设计RabbitMQ的方式--出版商向交易所发布,而不是排队。
如果没有队列绑定(如果交换需要一个匹配的路由密钥),则该消息将被丢弃。
您可以在发布时启用发行者返回并设置mandatory标志,代理将返回消息(但它到达的线程不同,而不是发布线程)。
发布于 2020-02-06 13:55:03
您的消息可以返回给您。
如果没有绑定到交换的队列。若要接收回这些消息而不丢失这些消息,您必须执行以下操作:
1.将这些属性添加到application.yml中
spring:
rabbitmq:
publisher-confirm-type: correlated
publisher-returns: true
template:
mandatory: true2.创建RabbitConfirmCallback
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
@Component
public class RabbitConfirmCallback implements RabbitTemplate.ConfirmCallback {
private static final Logger logger = LoggerFactory.getLogger(RabbitConfirmCallback.class);
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack && correlationData != null && correlationData.getId() != null) {
Message returnedMessage = correlationData.getReturnedMessage();
String dataId = correlationData.getId();
if (returnedMessage != null) {
logger.error("Message wasn't delivered to Consumer; " + returnedMessage + "\nCorrelationData id = " + dataId);
} else {
logger.info("CorrelationData with id " + dataId + " acknowledged;");
}
} else {
if (ack) {
logger.warn("Unknown message acknowledgement received: " + correlationData);
} else {
logger.info("Broker didn't accept message: " + cause);
}
}
}
}这个回调方法confirm(...) 将被触发,在这样一个没有限制队列的交换中发送消息的尝试就会被触发。在correlationData对象中,您将找到returnedMessage字段,其中将是消息的messageProperties和body。
3.将RabbitConfirmCallback设置为RabbitTemplate
@Autowired
public void post(RabbitTemplate rabbitTemplate, RabbitConfirmCallback rabbitConfirmCallback){
rabbitTemplate.setConfirmCallback(rabbitConfirmCallback);
}4.在发送消息时,添加CorrelationDate对象
有一些唯一的标识符
rabbitTemplate.convertAndSend(exchange, routingKey, wrapMessage(message),
new CorrelationData(stringId));https://stackoverflow.com/questions/44175968
复制相似问题