RabbitMQ应用场景——订单自动过期取消
场景描述:当用户下单后,状态为待支付,假如在规定的过期时间内尚未支付金额,那么就应该设置订单状态为取消。在不用MQ的情况下,我们可以设置一个定时器,每秒轮询数据库查找超出过期时间且未支付的订单,然后修改状态,但是这种方式会占用很多资源,所以在这里我们可以利用RabbitMQ的死信队列。
死信队列与普通队列一样,在以下情况下会变成死信队列:
-
消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false 消息过期 (rabbitmq Time-To-Live -> messageProperties.setExpiration()) 队列超出最大长度
下面是基于springboot的简单模拟案例: pom.xml文件:
<!-- rabbitmq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
application.properties文件:
##rabbitmq spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/ # 消息发送到交换机确认机制,是否确认回调 spring.rabbitmq.publisher-confirms=true
queue以及Exchange的创建与绑定:
消息的发送:
消息的消费: