rabbitMQ的死信问题

123 阅读2分钟

死信产生的条件

注:以下测试环境为:一个生产者,一个消费者(一个普通交换机,一个死信交换机,一个普通队列,一个死信队列),一个死信消费者(消费死信队列即可)

(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时间在后来多用于延迟队列,延迟队列为信息进入延迟队列后,会在指定时间出队列,
    通过信息判断消息是否被处理,假设处理则消亡,假设没处理则需更新数据库。
    
    场景:订单系统中的在指定时间内完成支付,否则自动取消