当前位置:   article > 正文

RabiitMQ延迟队列(死信交换机)

RabiitMQ延迟队列(死信交换机)

Dead Letter Exchange(死信交换机)

        在MQ中,当消息成为死信(Dead message 死掉的信息)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。而 在RabbitMQ中,由于有交换机的概念,实际是将死信发送给了死信交换机(Dead Letter Exchange,简称DLX)。死信交换机和死信队列和普通的没有区别。

消息成为死信的情况

  1. 队列消息长度到达限制
  2. 消费者拒签消息,并且不把消息重新放入原队列
  3. 消息到达存活时间未被消费

有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。至于怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。

  • 生产者 

  1. /**
  2. * 普通交换机绑定普通交换机
  3. *
  4. * @return
  5. */
  6. @Bean
  7. public Queue queueA() {
  8. //信息配置
  9. Map<String, Object> map = new HashMap<>();
  10. //message在该队列queue的存活时间最大为15秒
  11. map.put("x-message-ttl", 15000);
  12. //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
  13. map.put("x-dead-letter-exchange", "exchangeB");
  14. //x-dead-letter-routing-key参数是给这个DLX指定路由键
  15. map.put("x-dead-letter-routing-key", "queueB");
  16. return new Queue("queueA", true, false, false, map);
  17. }
  18. @Bean
  19. public DirectExchange exchangeA() {
  20. return new DirectExchange("exchangeA");
  21. }
  22. @Bean
  23. public Binding bindingA() {
  24. return BindingBuilder
  25. .bind(queueA())
  26. .to(exchangeA()).with("queueA");
  27. }
  28. /**
  29. * 死信交换机绑定死信交换机
  30. *
  31. * @return
  32. */
  33. @Bean
  34. public Queue queueB() {
  35. return new Queue("queueB");
  36. }
  37. @Bean
  38. public DirectExchange exchangeB() {
  39. return new DirectExchange("exchangeB");
  40. }
  41. @Bean
  42. public Binding bindingB() {
  43. return BindingBuilder
  44. .bind(queueB())
  45. .to(exchangeB()).with("queueB");
  46. }
  •  模拟发送请求
  1. @RequestMapping("/send6")
  2. public String sendSix() throws JsonProcessingException {
  3. rabbitTemplate.convertAndSend("exchangeA", "queueA", "检查订单是否过期");
  4. return "
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/80300
    推荐阅读
    相关标签