当前位置:   article > 正文

RabbitMQ死信交换机

rabbitmq死信交换机

一、什么是死信交换机

1.消息被拒绝,并且设置为requeue参数为false

2.消息过期(默认情况下Rabbit中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以上达到消息过期的效果)

3.队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时)

当满足上面三种情况时,消息会变成死信消息,并通过死信交换机投递到相应的队列中

 

二、代码实例

1.编写配置类,定义普通以及死信交换机和队列并各自绑定

  1. package com.example.provider.mq;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.amqp.core.Binding;
  4. import org.springframework.amqp.core.BindingBuilder;
  5. import org.springframework.amqp.core.DirectExchange;
  6. import org.springframework.amqp.core.Queue;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. @SuppressWarnings("all")
  12. @Slf4j
  13. @Configuration
  14. public class deadConfig {
  15. /**
  16. * 正常队列
  17. * @return
  18. */
  19. @Bean
  20. public Queue normalQueue(){
  21. Map<String,Object> map=new HashMap();
  22. map.put("x-message-ttl", 5000);//message在该队列queue的存活时间最大为10秒
  23. map.put("x-dead-letter-exchange", "deadExchange");//x-dead-letter-exchange参数
  24. //是设置该队列的死信交换器(DLX)
  25. map.put("x-dead-letter-routing-key","DD");//x-dead-letter-routing-key
  26. //参数是给这个DLX指定路由键
  27. return new Queue("normalQueue",true,false,false,map);
  28. }
  29. /**
  30. * 死信队列
  31. * @return
  32. */
  33. @Bean
  34. public Queue deadQueue(){
  35. return new Queue("deadQueue",true);
  36. }
  37. /**
  38. * 直连交换机
  39. * @return
  40. */
  41. @Bean
  42. public DirectExchange normalExchange(){
  43. return new DirectExchange("normalExchange");
  44. }
  45. /**
  46. * 死信交换机
  47. * @return
  48. */
  49. @Bean
  50. public DirectExchange deadExchange(){
  51. return new DirectExchange("deadExchange");
  52. }
  53. /**
  54. * 普通队列与交换机绑定
  55. * @return
  56. */
  57. @Bean
  58. public Binding binding(){
  59. return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
  60. }
  61. /**
  62. * 死信队列与死信机绑定
  63. * @return
  64. */
  65. @Bean
  66. public Binding deadbinding(){
  67. return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
  68. }
  69. }

 2.controller层模拟订单发出

@RequestMapping("/sendNormal")
public String sendNormal(){
    rabbitTemplate.convertAndSend("normalExchange","CC","订单1111");
    return "yes";
}

3.运行结果 

 

 表示接收到一条消息

5秒后消息消失变成0,因为5秒后过期了

然后由死信交换机传到死信队列

 4.在消费者中创建死信队列的接收类

  1. package com.example.consumer.mq;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.amqp.rabbit.annotation.RabbitHandler;
  4. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  5. import org.springframework.stereotype.Component;
  6. @Component
  7. @SuppressWarnings("all")
  8. @RabbitListener(queues ="deadQueue")
  9. @Slf4j
  10. public class DeadReceiver {
  11. @RabbitHandler
  12. public void process(String message){
  13. log.warn("订单过期"+message);
  14. }
  15. }

5.启动后死信队列的消息被接收

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/559845
推荐阅读
相关标签
  

闽ICP备14008679号