死信产生的条件
注:以下测试环境为:一个生产者,一个消费者(一个普通交换机,一个死信交换机,一个普通队列,一个死信队列),一个死信消费者(消费死信队列即可)
(1)超过指定队列大小
(2)被消息队列拒收
(3)设置TTL过期时间
1. 超过指定队列大小
(1)使用参数:在创建队列时,可以传入一个Map,在map中添加参数,然后将其作为一个队列参数设置普通队列。
如下:6为长度
map.put("x-max-length",6);
(2)使用流程
创建一个普通队列和一个死信队列,一个生产者,当指定队列长度之后,生产者的消息传入到队列中
数量超过指定的队列大小之后就会将信息传入到死信队列;此时如果你想消费死信队列中的数据,创建一个消费者指定消费队列即可。
2. 被消息队列拒收
(1)使用方法:
channel.basicReject(long l,boolean b);
(2)当消息被拒收后则会到死信队列
3. 设置TTL过期时间
(1)使用设置:一般在生产者处设置
AMQP.BasicProperties properties=
new AMQP.BasicProperties()
.builder().expiration("100000").build();
将properties作为一个参数传入到生产者的 basicPublisch()方法中
(2)产生效果:
首先关闭普通消费者,当生成者传输消息到普通队列时,由于过期时间的影响,在一定时间后,会自动
刷回到死信队列中,可以在rabbitMQ的页面上看到队列信息的跳转
(3)补充:
设置TTL时间在后来多用于延迟队列,延迟队列为信息进入延迟队列后,会在指定时间出队列,
通过信息判断消息是否被处理,假设处理则消亡,假设没处理则需更新数据库。
场景:订单系统中的在指定时间内完成支付,否则自动取消