MQ根据正常队列、死信队列来实现延迟队列的场景
1.Java_第一季_JAVASE_自增、单例模式、类与实例初始化过程、方法参数传递机制、递归和迭代、成员变量与局部变量2.Java_第一季_SSM_Spring Bean的作用域、Spring事务的传播行为、Spring MVC的执行流程、3.Java_第一季_java高级_Redis持久化、MySql何时建立索引4.java_JUC、volatile5.java_CAS6.java_阻塞队列(FIFO先进先出)7.JUC下countDownLatch、CyclicBarrier、Semaphore以及枚举的常见使用方法8.java_锁9.java_集合不安全10.Spring循环依赖11.AbstractQueuedSynchronizer---AQS12.LockSuport13.java_线程池7大参数_底层运行原理14.java_线程池三个常用方式15.Java_Callable<V>的基本使用16.java_锁_synchronized与Lock的区别17.java_强、软、弱、虚四大引用18.java_OOM19.JAVA-interview20.java_NIO21.java_JVM之GC22.java_JVM23.单例模式设计24.netty服务端、客户端简单搭建25.java使用webSocket与前端通讯26.java串口通讯27.用Java读取文件文字并语音播报28.Proguard-混淆29.Spring Security30.MQ31.spring相关面试题32.执行jar包33.Spring34.SpringBoot数据访问35.Java Stream(流)基本使用36.java集合工具类 Collections基本使用37.LocalDateTime、LocalDate、Date、String相互转化38.java8新特性39.java设计模式40.java springboot使用定时器
41.MQ根据正常队列、死信队列来实现延迟队列的场景
1、在RabbitMQ的管理后台新建交换机(exchange);
名称(Name): **ParkingExchange**
类型(Type): **fanout**
持久化(Durability): **Durable**
2、在RabbitMQ的管理后台新建队列(queue);
名称(Name): **ParkingQueue**
类型(Type): **Classic**(新版本RabbitMQ需要选)
持久化(Durability): **Durable**
参数设置(Arguments):
x-message-ttl = 3000(点下边的Message TTL)
x-dead-letter-exchange = Ump_mq(点下边的Dead letter exchange, 然后填写Ump_mq)
3、在RabbitMQ的管理后台设置交换机**ParkingExchange**的Binding中的**To Queue**为**ParkingQueue**;
4、以上设置了队列ParkingQueue, 其消息的生命周期为3000毫秒, 即进入此队列的消息3秒会死掉, 死掉的消息会进去dead-letter-exchange为Ump_mq的交换机, 也就是实现了3秒延迟的后半部分.
总结:
正常队列A、死信队列B进行绑定;
当数据放入死信队列B,并设置过期时间,数据过期之后,数据会从死信队列B重新放入正常队列A,此时监听器(正常队列A)会监听到消息并消费当前数据;
代码示例:
public void pushOrderWxPayDelayData(Long orderId,Long orgId){ //正常队列的key String routingKey = "klota3.0.order.wx.ispay.key.*.*"; //死信队列的名称 String delayQueueName = "mq-clota-order-wx-ispay-delay-queue"; //死信队列的Key String delayQueueKey = "klota3.0.order.wx.ispay.delay.key.*.*"; try { //1、将当前正常队列与死信队列绑定 rabbitMqManager.declareAndBindQueue(new TopicExchange("mq-clota-notice-topic-exchange"), 10, "mq-clota-notice-topic-exchange",routingKey, Collections.singletonMap(delayQueueName, delayQueueKey)); } catch (Exception e) { e.printStackTrace(); } Map<String, Object> headerMap = new HashMap<>(); headerMap.put("orderId", orderId); headerMap.put("orgId", orgId); MqSyncVo mqSyncVo = new MqSyncVo(); mqSyncVo.setMessageId(String.valueOf(orderId)); mqSyncVo.setSyncType(String.valueOf(orgId)); /** 推送消息 **/ Long seconds = 30L; String obj = redisUtil.getValue(String.format(RedisKeys.ORDER_WX_ISPAY_COUNT_KEY, orderId, orgId)); //当前死信队列的key,当前key与上方 delayQueueKey klota3.0.order.wx.ispay.delay.key.*.* 能匹配上 String delayRoutingKey = "klota3.0.order.wx.ispay.delay.key.016.909"; //2、将数据推送到死信队列,30S后过期,30S后过期的数据会从死信队列返回到正常队列,则正常队列中监听到数据会进行消费,则根据正常队列、死信队列来实现了延迟队列的场景 rabbitMqManager.sendJsonMsgForTranAfterCommit(RabbitMqConst.NOTICE_TOPIC_EXCHANGE, delayRoutingKey, mqSyncVo, headerMap, Duration.ofSeconds(30L), Boolean.FALSE, null); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?