13 死信队列

作者: 笑Skr人啊 | 来源:发表于2019-12-27 14:04 被阅读0次

1 图解

死信队列

2 消息如何进入死信队列

消息过期
队列长度已满(会将第一条消息放入死信队列)
消息被拒绝且不再重新尝试

3 应用场景

在定义业务队列时,指定一个死信交换机,并绑定一个死信队列
当消息变成死信时,该消息就会被发送到该死信队列上
这样就方便我们查看消息失败的原因

4 代码样例

4.1 生产者


/**
* 定义死信队列相关信息
 */
public final static String deadQueueName = "dead_queue";
public final static String deadRoutingKey = "dead_routing_key";
public final static String deadExchangeName = "dead_exchange";
/**
 * 死信队列 交换机标识符
 */
public static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
/**
 * 死信队列交换机绑定键标识符
 */
public static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";

// 邮件队列
private String FANOUT_EMAIL_QUEUE = "fanout_queue";
    
/**
* 配置死信队列
 * 
 * @return
 */
@Bean
public Queue deadQueue() {
    Queue queue = new Queue(deadQueueName, true);
    return queue;
}

/*
* 创建死信交换机
*/
@Bean
public DirectExchange deadExchange() {
    return new DirectExchange(deadExchangeName);
}

/*
* 将死信队列与死信交换机绑定
*/
@Bean
public Binding bindingDeadExchange(Queue deadQueue, DirectExchange deadExchange) {
    return BindingBuilder.bind(deadQueue).to(deadExchange).with(deadRoutingKey);
}

/**
* 声明业务队列,将死信交换机与队列进行绑定
 * @return Queue 
 */
@Bean
public Queue fanOutQueue() {
    Map<String, Object> args = new HashMap<>(2);
    args.put(DEAD_LETTER_QUEUE_KEY, deadExchangeName);
    args.put(DEAD_LETTER_ROUTING_KEY, deadRoutingKey);
    return new Queue(FANOUT_EMAIL_QUEUE, true, false, false, args);
}

4.2 消费者

try {
    // 通知mq服务器删除该消息
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
    // 消息放入死信队列
    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}

5 注意事项

如果创建队列时,未绑定死信交换机,如果想要绑定,需要将队列删除,重新创建

相关文章

  • 13 死信队列

    1 图解 2 消息如何进入死信队列 3 应用场景 4 代码样例 4.1 生产者 4.2 消费者 5 注意事项

  • RabbitMQ死信队列

    死信队列介绍 死信队列:DLX(dead-letter-exchange) 利用DLX,当消息在一个队列中变成死信...

  • RabbitMQ的死信队列详解

    死信队列介绍 死信队列:DLX,dead-letter-exchange 利用DLX,当消息在一个队列中变成死信 ...

  • 死信队列

    死信队列介绍 死信队列:DLX,dead-letter-exchange 利用DLX,当消息在一个队列中变成死信 ...

  • 【RabbitMQ-7】RabbitMQ—死信队列

    1. 死信队列概念 死信队列(Dead Letter Exchange),死信交换器。当业务队列中的消息被拒绝或者...

  • 【深度知识】RabbitMQ死信队列的原理及GO实现

    1. 摘要 本文按照以下目前讲解RabbitMQ死信队列的内容,包括:(1)死信队列是什么?(2)如何配置死信队列...

  • RabbitMQ—死信队列

    1. 死信队列概念 死信队列(Dead Letter Exchange)死信交换器。当业务队列中的消息被拒绝或者过...

  • Spring Boot系列——死信队列

    在说死信队列之前,我们先介绍下为什么需要用死信队列。 如果想直接了解死信对接,直接跳入下文的"死信队列"部分即可。...

  • RabbitMQ实现消息的最终一致性

    通过rabbit死信队列实现消息的最终一致性 配置消费队列 配置死信队列 被拒绝的消息会进入死信队列 正常数据消费...

  • 死信、延迟、重试队列

    死信队列 DLQ(Deal Letter Queue),死信队列。当一个消息在队列中变成死信之后,他能被重新发送到...

网友评论

    本文标题:13 死信队列

    本文链接:https://www.haomeiwen.com/subject/cykdoctx.html