在前面我们已经完成了秒杀系统的实际编码,这里还有一个环节需要操作下,就是如果有的人秒杀成功了,一般我们支付的时间是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分钟自动取消未支付订单的案例。最后附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...