需求和目标
商城系统,用户下单后若15分钟内仍未完成支付,则自动取消订单,若已支付,不做其他特殊操作
系统还需要支持即时消息的功能,即发即收。
名词解释
①即时队列:即发即收
②延迟队列:发了消息,没有接收方,只有消息过期后才被处理
③死信队列:延迟队列上的消息过期后,会被自动转发到死信队列中,从而最终达到延迟的目的
实现方式
本文采用RabbitMQ自身属性:
TTL(Time To Live存活时间) + DLX(Dead-Letter-Exchange死信交换机)
实现延迟队列,先将消息发到指定了TTL时长的队列A中,队列A没有消费者,也就是说,队列A中的消息肯定会过期,等消息过期后,就会加入到队列B,也就是死信队列,B队列是有消费者在监听的,一旦收到消息,就进行后续的逻辑处理,从而达到延迟效果。
这种实现方式只能为队列设置消息延迟的时长,不能为每个消息指定延迟时长,粒度比较粗,请注意使用的业务场景!
引入依赖
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
添加配置文件
分别声明了:即时、延迟、死信的相关信息
其中,延迟和死信是相互配合形成了延迟队列
# rabbitMQ配置
mq:
rabbit:
host: 127.0.0.1:5672
virtualHost: /
username: testUser
password: 123456
normal-exchange: wms_exchange_normal
normal-queue: wms_queue_normal
normal-routing-key: wms_routing_key_normal
delay-exchange: wms_exchange_delay
delay-queue: wms_queue_delay
delay-routing-key: wms_routing_key_delay
dlx-exchange: wms_exchange_dlx
dlx-queue: wms_queue_dlx
dlx-routing-key: wms_routing_key_dlx
配置类
package com.nwd.common.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitCon