在前面我们已经完成了秒杀系统的实际编码,这里还有一个环节需要操作下,就是如果有的人秒杀成功了,一般我们支付的时间是30分钟,但是此时间段内用户没有去付款,那么我们就需要把用户的订单给取消掉,并且把库存回退了,让其他用户可以进行抢购。
所以这里我们就来实现以下,主要的实现思路就是rabbitmq的死信队列,所以我们需要部署一个rabbitmq来实现这里的私信队列。下面我们来演示以下:
一、创建一个rabbitmq的生产者
这里我们使用原生的方式来创建rabbitmq的生产者,因为这里的生产者需要再初始化的时候设置延迟队列绑定信息,不能作为通用,所以这里我们是单独做的一个rabbitmq生产者,并且写一个发送的方法:
public Boolean sendMsg(String msg, Long expireTime) {
try {
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().deliveryMode(2)
.expiration(String.valueOf(expireTime)).build();
channel.basicPublish(DELAY_EXCHANGE, DELAY_ROUTING_KEY, properties, msg.getBytes());
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
return true;
}这里接收2个参数,分别是msg的body和过期时间。
二、创建一个消费者,取消订单
这里我们创建的消费者主要用来监听上面的正常队列,然后收到消息马上把订单取消。示例代码如下:
package org.order.service.rabbitmq;
import org.order.service.service.OrderService;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class OrderConsumer {
@Autowired
private OrderService orderService;
@RabbitListener(queuesToDeclare = @Queue(Constants.CANCELORDERTOPIC))
@RabbitHandler
public void receiveObject(CancelOrderPoJo msg) throws JsonProcessingException {
//这里的话,我们取消订单,并且增加库存
orderService.passiveCancelOrders(msg);
}
}到这里我们的rabbitmq端的代码就编写完成了,示例图如下:
三、发送mq
这里我们在秒杀接口里面添加代码,也就是创建订单完成之后,我们立马发送一条mq消息到死信队列,示例代码如下:
在这里我们模拟的是1分钟后取消订单,因此发送死信队列的时间设置为1分钟:
这时mq的逻辑是:
1、orderproduct把msg发送到死信队列A上。 2、过1分钟后,死信队列A上的msg过期了,会自动把消息发送到绑定的正常队列b上。 3、消费者监听到正常队列B上有msg,开始执行取消订单的代码。
然后我们运行一下即可看到在rabbitmq上有两个队列:
死信队列DelayCancelOrderTopic上只有进的消息,没有出的消息,因为没有正常消费者进行监听消费。
正常队列CancelOrderTopic上只有出的消息,没有进的消息,因为进的消息是死信队列自动路由转发的。出的消息是我们写的消费者进行监听消费的。
以上就是我们利用死信队列来完成30分钟自动取消未支付订单的案例。最后附上本案例的源码,登陆后即可下载。













还没有评论,来说两句吧...