场景描述:当用户下单后,状态为待支付,假如在规定的过期时间内尚未支付金额,那么就应该设置订单状态为取消。在不用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的创建与绑定:
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: ZJH
* @Date: 2019/3/7 15:35
*/
@Configuration
public class