赞
踩
一.代码+配置
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。