赞
踩
在MQ中,当消息成为死信(Dead message 死掉的信息)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。而 在RabbitMQ中,由于有交换机的概念,实际是将死信发送给了死信交换机(Dead Letter Exchange,简称DLX)。死信交换机和死信队列和普通的没有区别。
消息成为死信的情况
有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。至于怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。
- /**
- * 普通交换机绑定普通交换机
- *
- * @return
- */
- @Bean
- public Queue queueA() {
- //信息配置
- Map<String, Object> map = new HashMap<>();
- //message在该队列queue的存活时间最大为15秒
- map.put("x-message-ttl", 15000);
- //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
- map.put("x-dead-letter-exchange", "exchangeB");
- //x-dead-letter-routing-key参数是给这个DLX指定路由键
- map.put("x-dead-letter-routing-key", "queueB");
- return new Queue("queueA", true, false, false, map);
- }
-
- @Bean
- public DirectExchange exchangeA() {
- return new DirectExchange("exchangeA");
- }
-
- @Bean
- public Binding bindingA() {
- return BindingBuilder
- .bind(queueA())
- .to(exchangeA()).with("queueA");
- }
-
- /**
- * 死信交换机绑定死信交换机
- *
- * @return
- */
- @Bean
- public Queue queueB() {
- return new Queue("queueB");
- }
-
- @Bean
- public DirectExchange exchangeB() {
- return new DirectExchange("exchangeB");
- }
-
- @Bean
- public Binding bindingB() {
- return BindingBuilder
- .bind(queueB())
- .to(exchangeB()).with("queueB");
- }
- @RequestMapping("/send6")
- public String sendSix() throws JsonProcessingException {
- rabbitTemplate.convertAndSend("exchangeA", "queueA", "检查订单是否过期");
- return "声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/80300推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。