RabbitMQ之死信交换机(延迟队列)
作者:互联网
死信队列(延迟队列)
死信,在官网中对应的单词为“Dead Letter”,它是 RabbitMQ 的一种消息机制。
般来说,生产者将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,如果它一直无法消费某条数据,那么可以把这条消息放入死信队列里面。等待
条件满足了再从死信队列中取出来再次消费,从而避免消息丢失。
死信消息来源:
1.消息 TTL 过期
2.队列满了,无法再次添加数据
3.消息被拒绝(reject 或 nack),并且 requeue =false
订单的超时处理
后超时的订单消息到正常交换机exchange-a中,消息匹配到队列queue-a,但一分钟后仍未消费。
消息会被投递到死信交换机dlx-exchange中,并发送到死信队列中;
死信队列dlx-exchange的消费者拿到消息后,根据消息去查询订单的状态,如果仍然是未支付状态,将订单状态更新为超时状态。
代码
DeadConfig类
注意:死信交换机就是一台普通的交换机!!!
package com.example.provider.mq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
@SuppressWarnings("all")
public class DeadConfig {
//1.需要正常的交换机
//2.正常的队列发出消息(具备配置)
//3.具备死信交换机,死信队列
@Bean
public Queue normalQueue(){
Map<String,Object> config=new HashMap<>();
//设置过期时间
config.put("x-message-ttl",10000);
//死信交换机
config.put("x-dead-letter-exchange", "deadExchange");
//死信routingkey
config.put("x-dead-letter-routing-key", "DD");
return new Queue("normalQueue",true,false,false,config);
}
@Bean
public Queue deadQueue(){
return new Queue("deadQueue",true);
}
@Bean
public DirectExchange normalExchange(){
return new DirectExchange("normalExchange");
}
//死信交换机就是一台正常的交换机
@Bean
public DirectExchange deadExchange(){
return new DirectExchange("deadExchange");
}
@Bean
public Binding normalBinding(){
return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
}
@Bean
public Binding deadBinding(){
return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
}
}
ProviderController类
@RequestMapping("/deadSend")
public String deadSend(){
//保存了一个订单
template.convertAndSend("normalExchange","CC","order-1109");
return "yes";
}
发送数据
上图可以看到
normalQueue队列有一个正常的消息,但是我代码里面设定了十秒钟的过期时间,之前死信队列还只有两台消息
上图可知现在deadQueue已经变成三条了,死信完成,希望能帮助你们
bye~
标签:return,队列,RabbitMQ,死信,交换机,import,public 来源: https://blog.csdn.net/Cat_Jay_Fish/article/details/123184225