首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果队列不存在,消息将丢失

如果队列不存在,消息将丢失
EN

Stack Overflow用户
提问于 2017-05-25 08:35:55
回答 2查看 5.8K关注 0票数 7

当我们将消息发送到RabbitMQ时,如果队列不存在,消息就会丢失,而不会引发任何错误。

信息将被张贴到哪里?死队列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-25 13:40:12

这就是设计RabbitMQ的方式--出版商向交易所发布,而不是排队。

如果没有队列绑定(如果交换需要一个匹配的路由密钥),则该消息将被丢弃。

您可以在发布时启用发行者返回并设置mandatory标志,代理将返回消息(但它到达的线程不同,而不是发布线程)。

票数 14
EN

Stack Overflow用户

发布于 2020-02-06 13:55:03

您的消息可以返回给您。

如果没有绑定到交换的队列。若要接收回这些消息而不丢失这些消息,您必须执行以下操作:

1.将这些属性添加到application.yml

代码语言:javascript
复制
spring:
  rabbitmq:
    publisher-confirm-type: correlated
    publisher-returns: true
    template:
      mandatory: true

2.创建RabbitConfirmCallback

代码语言:javascript
复制
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字段,其中将是消息的messagePropertiesbody

3.将RabbitConfirmCallback设置为RabbitTemplate

代码语言:javascript
复制
@Autowired
public void post(RabbitTemplate rabbitTemplate, RabbitConfirmCallback rabbitConfirmCallback){
    rabbitTemplate.setConfirmCallback(rabbitConfirmCallback);
}

4.在发送消息时,添加CorrelationDate对象

有一些唯一的标识符

代码语言:javascript
复制
rabbitTemplate.convertAndSend(exchange, routingKey, wrapMessage(message),
                              new CorrelationData(stringId));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44175968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档