RabbitMQ高级特性第4篇-延迟队列

一、前言

本文演示的延迟队列是基于SpringBoot整合RabbitMQ来实现的,关于SpringBoot整合RabbitMQ可参考该链接:https://blog.csdn.net/pkxwyf/article/details/105158608

二、延迟队列概述和原理

2.1、什么是延迟队列

所谓延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

2.1、延迟队列应用场景

  • 用户下单后,30分钟未支付,取消订单恢复库存。

2.3、延迟队列实现原理

很可惜的是在RabbitMQ中并未提供延迟队列功能,但是可以使用:TTL+死信队列 组合实现延迟队列的效果

三、延迟队列代码演示

3.1、消息生产方代码实现

1、编写配置类:定义交换机和队列信息


@Configuration
public class RabbitMQConfig {
    // 普通交换机名称
    public static final String EXCHANGE_NAME = "order_topic_exchange";
    // 普通队列名称
    public static final String QUEUE_NAME = "order_queue";

    // 死信交换机名称
    public static final String DEAD_EXCHANGE_NAME = "dead_order_topic_exchange";
    // 死信队列名称
    public static final String DEAD_QUEUE_NAME = "dead_order_queue";

    // 1. 定义普通交换机
    @Bean("orderExchange")
    public Exchange createExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }

    // 2. 定义普通队列
    @Bean("orderQueue")
    public Queue createQueue(){
        // 创建map集合:封装队列参数
        Map<String,Object> map = new HashMap<>();
        // 设置死信交换机名称
        map.put("x-dead-letter-exchange", DEAD_EXCHANGE_NAME);
        // 设置发送给死信交换机的routingKey
        map.put("x-dead-letter-routing-key", "dead.order.news");
        // 设置队列过期时间:单位毫秒
        map.put("x-message-ttl", 10000);
        return QueueBuilder.durable(QUEUE_NAME).withArguments(map).build();
    }

    // 3. 定义死信交换机
    @Bean("deadOrderExchange")
    public Exchange createDeadExchange(){
        return ExchangeBuilder.topicExchange(DEAD_EXCHANGE_NAME).durable(true).build();
    }

    // 4. 定义死信队列
    @Bean("deadOrderQueue")
    public Queue createDeadQueue(){
        // 创建map集合:封装队列参数
        return QueueBuilder.durable(DEAD_QUEUE_NAME).build();
    }

    // 5. 队列与交换机绑定关系
    @Bean
    public Binding bindExchangeAndQueue(@Qualifier("orderQueue") Queue queue,
                                        @Qualifier("orderExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("order.#").noargs();
    }

    // 6. 死信队列与死信交换机绑定关系
    @Bean
    public Binding bindDeadExchangeAndQueue(@Qualifier("deadOrderQueue") Queue queue,
                                        @Qualifier("deadOrderExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("dead.order.#").noargs();
    }

}

2、编写测试类:发送消息到MQ中

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestDelayQueue {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 测试延迟队列
     */
    @Test
    public void testSendStr() throws Exception{
        // 发送消息
        // 参数1:交换机名字
        // 参数2:路由键
        // 参数3:消息字符串
        rabbitTemplate.convertAndSend(
                "order_topic_exchange",
                "order.news",
                "用户下单成功,订单ID:1");
    }
}

3.2、消息消费方代码实现

@Component
public class RabbitMQConfig {
    /**
     * 监听mq消息
     */
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(value = "dead_order_topic_exchange",type = "topic"),
            value = @Queue(value = "dead_order_queue",durable = "true"),
            key = "dead.order.#"
    ))
    public void handlerMessage(Message message, Channel channel)throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            // 1. 转换消息
            System.out.println(new String(message.getBody()));
            // 2. 业务处理
            System.out.println("执行业务处理...");
            System.out.println("根据订单id查询状态...");
            System.out.println("判断是否支付成功...");
            System.out.println("取消订单,回滚库存...");
            // 3. 手工签收
            channel.basicAck(deliveryTag,true);
        } catch (Exception e) {
            // 4. 拒绝签收
            channel.basicNack(deliveryTag,true,false);
        }
    }
}

四、延迟队列小结

  1. 延迟队列指消息进入队列后,可以被延迟一定时间再进行消费。
  2. RabbitMQ没有提供延迟队列功能,但可以使用:TTL+DLX实现延迟队列效果。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RabbitMQ具有一些高级特性,使其在消息队列系统中具有更强大的功能和灵活性。以下是一些常见的高级特性: 1. 死信队列(Dead Letter Exchange):RabbitMQ允许将无法被消费或处理的消息路由到特定的死信队列中。这对于处理异常情况或者无法处理的消息非常有用,可以进行后续的处理或者分析。 2. 延迟队列(Delayed Message Exchange):RabbitMQ支持通过插件或者自定义方式实现延迟队列,可以将消息延迟一段时间后再进行投递。这对于需要在特定时间点或者一定延迟后处理消息的场景非常有用。 3. 消息优先级(Message Priority):RabbitMQ允许为消息设置不同的优先级,确保高优先级的消息能够更快地得到处理。这对于处理紧急任务或者优先级较高的消息非常有用。 4. 消息确认机制(Message Acknowledgement):RabbitMQ支持消息确认机制,在消息被消费者成功处理后进行确认,确保消息不会丢失。这对于保证消息的可靠传递非常重要。 5. 消费者限流(Consumer Flow Control):RabbitMQ提供了消费者限流机制,可以控制消费者接收消息的速率,避免消息堆积和过载的情况发生。这对于保证系统的稳定性和性能非常重要。 6. 插件机制(Plugin System):RabbitMQ具有丰富的插件系统,可以通过安装和配置插件来增加新的功能和扩展性。例如,可以通过插件实现消息的压缩、加密、转换等扩展功能。 这些高级特性使得RabbitMQ成为一个强大而灵活的消息队列系统,适用于各种复杂的应用场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fkjaios_xkp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值