rabbitmq 消息过期成为死信的2种方法

1.设置队列消息过期时间
@Bean //注入正常交换器
public FanoutExchange normalExchange() {
    return new FanoutExchange("NORMAL_EXCHANGE", true, false);
}

@Bean //注入正常队列
public Queue normalQueue() {
    Map<String, Object> params = new HashMap<>();
    //队列里面的死信会转发到DLX_EXCHANGE交换器上
    params.put("x-dead-letter-exchange", "DLX_EXCHANGE");
    //队列中的消息超过60秒没被消费,则成为死信
    //(这个属性设置要第一次声明队列时才有用,如果队列一开始已存在且没有这个属性,则要删掉队列再重新声明才有用)
    params.put("x-message-ttl", 60 * 1000);
    return new Queue("MY_QUEUE", true, false, false, params);
}

@Bean //交换机与队列进行绑定
public Binding dlxQueueBind(@Qualifier("normalQueue") Queue queue, @Qualifier("normalExchange") FanoutExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange);
}

2.设置单个消息过期时间
MessageProperties properties = new MessageProperties();
//该消息在队列中超过60秒没被消费,则成为死信
properties.setExpiration(60 * 1000 + "");
Message message = MessageBuilder
        .withBody("abc".getBody())
        .andProperties(properties)
        .build();
rabbitTemplate.convertAndSend("NORMAL_EXCHANGE", "NORMAL_ROUTINGKEY", message);

无论用以上哪种方法,都是等消息到达队列头即将要被消费时,才会判断是否过期。

所以对于方法2,可能队列中某个消息已经过期了,但它还没到达队列头部,因此还会停留在队列中。

这种只判断队列头是否过期的方法的优势是,不用时刻扫描整个队列的所有消息去判断哪个过期,这样非常耗资源。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值