RabbitMQ死信队列和延迟队列(六)

死信队列

        DLX全称dead-letter-exchange,可以称之为死信交换器。当消息在一个队列中变成死信之后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称之为死信队列。

        消息变成死信一般是由一下集中情况:

        1.消息被拒绝之后,并设置requeue为false。

        2.消息过期。

        3.队列达到最大长度。

        DLX也是一个普通交换器,它能在任何队列上被指定,实际就是设置某个队列的属性。当这个队列存在死信时,RabbitMQ就会把消息重新发送到DLX上,进而被路由到另一个队列,即死信队列。实际开发中可以将处理异常的消息发送到死信队列,定期处理死信队列信息,完善系统。

        通过channel.queueDecalre方法设置x-dead-letter-exchange参数为这个队列添加DLX。

        channel.exchangeDeclare(dlxExchangeName, ExchangeTypes.DIRECT, true);
        channel.queueDeclare(dlxQueueName, true, false, false, null);
        channel.queueBind(dlxQueueName, dlxExchangeName, "dlxKey");
        channel.exchangeDeclare(normalExchangeName, ExchangeTypes.FANOUT, true);
        Map<String, Object> map = new HashMap<>();
        map.put("x-message-ttl", 10000);
        map.put("x-dead-letter-exchange", dlxExchangeName);
        map.put("x-dead-letter-routing-key", "dlxKey");
        channel.queueDeclare(normalQueueName, true, false, false, map);
        channel.queueBind(normalQueueName, normalExchangeName, "");
        channel.basicPublish(normalExchangeName, "dlx", MessageProperties.PERSISTENT_TEXT_PLAIN, "我要进死信队列".getBytes());

        上面声明了两个普通交换器,给其中一个交换器的队列设置消息过期时间、死信交换器名称、发送到死信交换器时消息的routingKey。发送一条路由为dlx的消息到普通队列,过期之后消息被发送到死信交换器,并且当前消息的路由被改为dlxKey。

延迟队列

        延迟队列存储的对象是对应的延迟消息,所谓的延迟消息就说值当消息发送出去之后不想让消费者立即消费,而是等到特定时间之后,消费者才能去消费。

        RabbitMQ本身没有直接支持延迟队列的功能,但是可以通过设置消息TTL和DLX达到延迟队列的功能,上面死信队列的代码也是一个延迟队列的例子,生产者发出消息后10s进入dlxQueue,消费者订阅dlxQueue就达到一个延迟队列的效果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值