rabbitmq 死信队列的使用方式

一.代码+配置
1.首先建立一个队列,标示为死信队列

Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("some.exchange.name", "direct");

Map<String, Object> args = new HashMap<String, Object>();
channel.queueDeclare("myqueue", false, false, false, args);

2.其它队列设置x-dead-letter-exchange参数为死信队列的值

@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "test",
        arguments = {@Argument(name = "x-dead-letter-exchange", value = "some.exchange.name")}),
        exchange = @Exchange(value = "exchange"))})

在以下3种情况会进入死信队列
1.有消息被拒绝(basic.reject/ basic.nack)并且requeue=false
2.队列达到最大长度
3.消息TTL过期

二.管理后台设置
在rabbitmq 监控中 设置 配置

name: 配置名称
pattern:匹配规则
apply to: 针对队列还是交换机
priority: 优先级
definition: 具体的配置
值 意义

arguments键意义
x-message-ttl数字类型,标志时间,以豪秒为单位标志队列中的消息存活时间,也就是说队列中的消息超过了制定时间会被删除
x-expires数字类型,标志时间,以豪秒为单位队列自身的空闲存活时间,当前的queue在指定的时间内,没有consumer、basic.get也就是未被访问,就会被删除。
x-max-length和x-max-length-bytes数字最大长度和最大占用空间,设置了最大长度的队列,在超过了最大长度后进行插入会删除之前插入的消息为本次的留出空间,相应的最大占用大小也是这个道理,当超过了这个大小的时候,会删除之前插入的消息为本次的留出空间。
x-dead-letter-exchange和x-dead-letter-routing-key字符串消息因为超时或超过限制在队列里消失,这样我们就丢失了一些消息,也许里面就有一些是我们做需要获知的。而rabbitmq的死信功能则为我们带来了解决方案。设置了dead letter exchange与dead letter routingkey(要么都设定,要么都不设定)那些因为超时或超出限制而被删除的消息会被推动到我们设置的exchange中,再根据routingkey推到queue中
x-max-priority数字队列所支持的优先级别,列如设置为5,表示队列支持0到5六个优先级别,5最高,0最低,当然这需要生产者在发送消息时指定消息的优先级别,消息按照优先级别从高到低的顺序分发给消费者
alternate-exchange下面简称AE,当一个消息不能被route的时候,如果exchange设定了AE,则消息会被投递到AE。如果存在AE链,则会按此继续投递,直到消息被route或AE链结束或遇到已经尝试route过消息的AE。

三.命令方式
rabbitmqctl set_policy DLX “.*” ‘{“dead-letter-exchange”:“my-dlx”}’ --apply-to queues

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值