首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
30 篇文章
1
可视化接口管理平台 YApi,让你轻松搞定 API 的管理问题
2
面试必考:秒杀系统如何设计?
3
Spring Boot 中的线程池,这也太好用了!
4
用了很多年的 CMS 垃圾收集器,终于换成了 G1,真香!!
5
雪花算法到底是啥原理?附 Java 实现!
6
SpringBoot:优雅地处理全局异常
7
七种分布式事务的解决方案,一次讲给你听!
8
RabbitMQ 死信队列是什么鬼?
9
RabbitMQ 中的消息还能过期?
10
来,通过 Excel 来认识神器——POI
11
使用easypoi导出excel
12
图文并茂:AQS 是怎么运行的?
13
使用 Docker 部署 Spring Boot 项目,带劲!!
14
写了个牛逼的日志切面,甩锅更方便了!
15
终于有人把 Spring 循环依赖讲清楚了!
16
免费获取 IntelliJ IDEA 激活码的 6 种方式!
17
Spring Boot 如何快速集成 Redis 哨兵?
18
10w+ Excel 数据导入,怎么优化?
19
10 个牛逼的单行代码编程技巧,你会用吗?
20
Logback 配置文件这么写,TPS 提高 10 倍!
21
18 个示例带你掌握 Java 8 日期时间处理!
22
用户密码到底要怎么加密存储?
23
Spring Cloud 如何动态刷新 Git 仓库配置?
24
为什么微服务一定要有网关?
25
牛逼哄哄的数据库连接池,底层原理是个啥?
26
如何快速安全的插入千万条数据?
27
Redis 是怎么实现 “附近的人” 的?
28
20 亿的 URL 集合,如何快速判断其中一个?
29
不用找了,大厂在用的分库分表方案,都在这了!
30
Java 程序员常犯的 10 个 SQL 错误!

RabbitMQ 死信队列是什么鬼?

Java技术栈

www.javastack.cn

关注阅读更多优质文章

作者:海向 来源:www.cnblogs.com/haixiang/p/10905189.html

死信队列

死信队列:没有被及时消费的消息存放的队列。

消息没有被及时消费的原因:

实现死信队列步骤

首先需要设置死信队列的 exchange 和 queue,然后进行绑定:

代码语言:javascript
复制
Exchange: dlx.exchange
Queue: dlx.queue
RoutingKey: # 代表接收所有路由 key

然后我们进行正常声明交换机、队列、绑定,只不过我们需要在普通队列加上一个参数即可: arguments.put("x-dead-letter-exchange",' dlx.exchange' )

这样消息在过期、requeue失败、 队列在达到最大长度时,消息就可以直接路由到死信队列!RabbitMQ 系列面试题和答案我都整理好了,关注公众号Java技术栈在后台回复面试获取。

代码语言:javascript
复制
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class DlxProducer {
    public static void main(String[] args) throws Exception {
    //设置连接以及创建 channel 湖绿
        String exchangeName = "test_dlx_exchange";
        String routingKey = "item.update";
      
        String msg = "this is dlx msg";

        //我们设置消息过期时间,10秒后再消费 让消息进入死信队列
        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                .deliveryMode(2)
                .expiration("10000")
                .build();

        channel.basicPublish(exchangeName, routingKey, true, properties, msg.getBytes());
        System.out.println("Send message : " + msg);

        channel.close();
        connection.close();
    }
}
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class DlxConsumer {
    public static void main(String[] args) throws Exception {
    //创建连接、创建channel忽略 内容可以在上面代码中获取
        String exchangeName = "test_dlx_exchange";
        String queueName = "test_dlx_queue";
        String routingKey = "item.#";

        //必须设置参数到 arguments 中
        Map<String, Object> arguments = new HashMap<String, Object>();
        arguments.put("x-dead-letter-exchange", "dlx.exchange");

        channel.exchangeDeclare(exchangeName, "topic", true, false, null);
        //将 arguments 放入队列的声明中
        channel.queueDeclare(queueName, true, false, false, arguments);

        //一般不用代码绑定,在管理界面手动绑定
        channel.queueBind(queueName, exchangeName, routingKey);


        //声明死信队列
        channel.exchangeDeclare("dlx.exchange", "topic", true, false, null);
        channel.queueDeclare("dlx.queue", true, false, false, null);
        //路由键为 # 代表可以路由到所有消息
        channel.queueBind("dlx.queue", "dlx.exchange", "#");

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body)
                    throws IOException {

                String message = new String(body, "UTF-8");
                System.out.println(" [x] Received '" + message + "'");

            }
        };

        //6. 设置 Channel 消费者绑定队列
        channel.basicConsume(queueName, true, consumer);
    }
}

总结

DLX也是一个正常的 Exchange,和一般的 Exchange 没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。

当这个队列中有死信时,RabbitMQ 就会自动的将这个消息重新发布到设置的 Exchange 上去,进而被路由到另一个队列。可以监听这个队列中消息做相应的处理。

RabbitMQ 系列面试题和答案我都整理好了,关注公众号Java技术栈在后台回复面试获取。

下一篇
举报
领券