延迟队列
Rabbitmq并没有延迟队列
但是:死信队列+消息时间设置过期时间可以 达成我们想要的延迟队列效果
例如下单5分钟之内未支付就会取消订单,那么设置下单支付时间为5分钟后过期然后进入死信队列,一旦进入死信队列那么就自动取消订单
代码
消费者:
@Component
public class ttlproducer {
@Autowired
private RabbitTemplate rabbitTemplate;
// 模拟订单
public void makeTest(String a,String b){
String ExchangeName = "ttl.direct.Exchange";
String luYouKey = "ttl";
String message = UUID.randomUUID().toString();
System.out.println("订单生成----"+message);
rabbitTemplate.convertAndSend(ExchangeName,luYouKey,message);
}
}
创建死信队列
这个死信队列 专门存放未支付订单的消息
@Configuration
public class dlxconsumer {
@Bean
public DirectExchange deadExchange(){
return new DirectExchange("dlx.direct.Exchange");
}
@Bean
public Queue abcdQueue(){
return new Queue("si.xin.Queue");
}
@Bean
public Binding abcdBinding(){
return BindingBuilder.bind(abcdQueue()).to(deadExchange()).with("dead");
}
}
创建订单过期时间
@Configuration
public class ttlconsumer {
@Bean
public DirectExchange directExchange(){
return new DirectExchange("ttl.direct.Exchange",true,false);
}
@Bean
public Queue abcQueue(){
HashMap<String, Object> args = new HashMap<>();
args.put("x-message-ttl",5000);//5秒
args.put("x-dead-letter-exchange","dlx.direct.Exchange");
args.put("x-dead-letter-routing-key","dead");
return new Queue("ding.dan.Queue",true,false,false,args);
}
@Bean
public Binding abcBinding(){
return BindingBuilder.bind(abcQueue()).to(directExchange()).with("ttl");
}
}
测试
@SpringBootTest
class SpringBootRabbitmqSixingduilieApplicationTests {
@Autowired
private ttlproducer ttlproducer;
@Test
void contextLoads() {
ttlproducer.makeTest("下单","...");
}
}
我们可以去web界面看
订单超时时间设置的是5秒过期时间
看看我们过期的消息是否进入到死信队列
其实上面的死信队列已经起到了延迟队列的作用
5秒内如果消费不了就会转投到死信队列里