rabbitmq延迟队列实现

本文介绍了如何利用RabbitMQ的死信队列功能实现延迟队列的效果。通过设置订单5分钟后未支付自动取消的场景为例,阐述了创建死信队列和设置订单过期时间的过程,并通过测试验证了5秒内未消费的消息会转入死信队列,从而达到延迟处理的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

延迟队列

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秒内如果消费不了就会转投到死信队列里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值