RabbitMq 延迟队列

前言

延迟消息队列在我们工作中使用的场景特别多,比如超时未支付取消订单,异步业务时间有时间间隔,等等,今天我们就来聊一聊使用消息延迟队列

需求

使用RabbitMq  实现延迟队列,5分钟之后进行消息的消费

方式

  1. 基于死信队列
  2. 基于插件 (如果支持可以用,如果没有建议第一种,怕引入插件产生版本冲突)

实现

 今天就基于死信队列咱们玩一下
原理图

delay impl

代码实现
 import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wind
 * @example ${bizName} 自己的业务名称,记得替换   eg: pay_cancel
 *  使用时同一替换 ${bizName}
 * @des :
 *    1. 准备两个普通队列
 *    2. 其中的一个队列构造 是 自己的queuename + ttl + deadExchange + deadRoutingKey  (core )
 */
@Configuration
public class ${bizName}DelayConfig {

    public  static final String ${bizName}_DELAY_EXCHANGE_NAME =${bizName}+"_delay_exchange";
    public  static final String ${bizName}_DELAY_QUEUE_NAME =${bizName}+"r_delay_queue";
    public  static final String ${bizName}_DELAY_ROUTING_KEY =${bizName}+"_delay_routing_key";

    public  static final String ${bizName}_DEAD_EXCHANGE_NAME =${bizName}+"_dead_exchange";
    public  static final String ${bizName}_DEAD_QUEUE_NAME =${bizName}+"dead_queue";
    public  static final String ${bizName}_DEAD_ROUTING_KEY =${bizName}+"_dead_routing_key";


    /**
     * 核心  和死信队列建立关键的核心
     */
    @Bean
    Queue delayedQueue() {
        return QueueBuilder
                .durable(${bizName}_DELAY_QUEUE_NAME)
                .ttl(300000)
                .deadLetterExchange(${bizName}_DEAD_EXCHANGE_NAME)
                .deadLetterRoutingKey(${bizName}_DEAD_ROUTING_KEY)
                .build();
    }

    
    @Bean
    public DirectExchange delayedExchange(){
        return  new DirectExchange(${bizName}_DELAY_EXCHANGE_NAME);
    }

    @Bean
    Binding delayedBinding(Queue delayedQueue,DirectExchange delayedExchange) {
      return BindingBuilder.bind(delayedQueue)
              .to(delayedExchange)
              .with(${bizName}_DELAY_ROUTING_KEY);
    }


    @Bean
    public Queue deadQueueOrder() {
        return QueueBuilder.durable(${bizName}_DEAD_QUEUE_NAME)
                .deadLetterExchange(${bizName}_DEAD_EXCHANGE_NAME)
                .deadLetterRoutingKey(${bizName}_DEAD_ROUTING_KEY)
                .build();
    }

    @Bean
    public DirectExchange deadExchangeOrder() {
        return new DirectExchange(${bizName}_DEAD_EXCHANGE_NAME);
    }
    
    @Bean
    public Binding bindingDeadExchange(Queue deadQueueOrder,DirectExchange deadExchangeOrder) {
        return BindingBuilder.bind(deadQueueOrder).to(deadExchangeOrder).with(${bizName}_DEAD_ROUTING_KEY);
    }
    
}

监听:
/**
 * @author wind
 * @des  监听的是死信队列  ttl 过后进行消费
 *
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class ${bizName}DelayRefundMqListener {
   
    @RabbitListener(queues=${bizName}DelayConfigDelayConfig.${bizName}_DEAD_QUEUE_NAME)
	public void rechargeResult(String msg, Channel channel, Message message) {
        try {
            log.info("业务消息进来 rechargeResultMQMessage:{}", msg);
            处理业务逻辑
        } finally {
            try {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            } catch (Exception e) {
                log.error("充值退款延迟消息 确认消息失败");
            }
        }

    }

}

相关推荐

  1. RabbitMQ 如何使用延迟队列

    2024-06-17 09:00:01       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 09:00:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 09:00:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 09:00:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 09:00:01       18 阅读

热门阅读

  1. 超详细的描述UItralytics中的特征增强方法

    2024-06-17 09:00:01       7 阅读
  2. 【C/C++】实参与形参的区别

    2024-06-17 09:00:01       7 阅读
  3. Leetcode274. H 指数(简单易于理解)

    2024-06-17 09:00:01       7 阅读
  4. 跨服务器迁移 Redis 数据

    2024-06-17 09:00:01       6 阅读
  5. 《时间管理九段》前四阶段学习笔记

    2024-06-17 09:00:01       6 阅读
  6. LeetCode-day14-521. 最长特殊序列 Ⅰ

    2024-06-17 09:00:01       8 阅读
  7. leetcode67 二进制求和

    2024-06-17 09:00:01       8 阅读
  8. 力扣1631.最小体力消耗路径

    2024-06-17 09:00:01       6 阅读
  9. 算法第七天:leetcode之209.长度最小的子数组

    2024-06-17 09:00:01       6 阅读
  10. leetcode198 打家劫舍

    2024-06-17 09:00:01       7 阅读
  11. 结构型模式-享元模式

    2024-06-17 09:00:01       7 阅读
  12. CMake Tutorial (3.30-rc3版) 练习和点评

    2024-06-17 09:00:01       7 阅读
  13. HTML中的<br>、<hr>和<pre>标签使用指南

    2024-06-17 09:00:01       8 阅读
  14. 重庆思庄技术分享——启动Oracle下最小追踪日志

    2024-06-17 09:00:01       7 阅读
  15. vue实现图片预览

    2024-06-17 09:00:01       5 阅读
  16. 「C系列」C 文件读写

    2024-06-17 09:00:01       7 阅读
  17. 后端开发面试题4(附答案)

    2024-06-17 09:00:01       6 阅读
  18. C++ 二分查找法【面试】

    2024-06-17 09:00:01       6 阅读