- 场景
订单30分钟未支付,系统自动关闭有哪些实现方案?
1.基于任务调度实现;
2.基于redis过期key实现;
3.基于redis延迟队列;
4.基于MQ的延迟队列;
- 本次使用RabbitMQ实现一个小demo
原理:我们在下单后,往MQ投递一个消息,设置其有效期为30分钟,在不设置对应队列的消费者的情况下,该消息将一直不被消费,那么30分钟后,该消息过期会被投递到死信队列,由死信消费者消费,我们就可以在死信消费者根据订单id执行相应的业务逻辑。
- application.properties中MQ的配置
#配置virtual-host虚拟主机
spring.rabbitmq.virtual-host=test_order_close
#ip地址
spring.rabbitmq.host=127.0.0.1
#用户名 密码
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#连接端口号
spring.rabbitmq.port=5672
#死信队列
test.dlx.exchange=test_order_dlx_exchange
test.dlx.queue=test_order_dlx_queue
test.dlx.routingKey=dlx
##备胎交换机
test.order.exchange=test_order_exchange
test.order.queue=test_order_queue
test.order.routingKey=test.order
@Component
public class DeadLetterMQConfig {
@Value("${test.order.exchange}")
private String orderExchange;
@Value("${test.order.queue}")
private String orderQueue;
@Value("${test.order.routingKey}")
private String orderRoutingKey;
@Value("${test.dlx.exchange}")
private String dlxExchange;