文章目录
- 前言
- 一、场景?
- 二、使用步骤
- 1.项目配置好rocketmq
- 2.读入数据
- 其他方式处理订单到期关闭
- 定时任务
前言
实习期间在做订单模块。遇到过订单到时关闭的场景。
因为我们在通过回调接收第三方订单状态的时候,使用了rocketmq,在遇到订单超时关闭的场景的时候,为了不引入额外的依赖,我们就继续使用rocketmq的延迟队列来做实现。
同时记录几种刚了解到的订单到期关闭实现方式。
一、场景?
酒店模块中,比如用户下单酒店了。
我们要设置超过多少分钟,就将订单自动取消了。
二、使用步骤
1.项目配置好rocketmq
2.读入数据
创建一个生产者
public class DelayProduce {@Autowiredprivate RocketMQTemplate rocketMQTemplate;/*** @param topic 主题* @param message 消息内容* @param delayLevel 分为18个等级,分别对应:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h*/public void sendDelayMessage(String topic, String message, int delayLevel) {SendResult sendResult = rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(), 10000L, delayLevel);log.info("sendtime is {}", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now()));log.info("sendResult is{}", sendResult);}public void sendCommonMessage(String topic, String message) {SendResult sendResult = rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(), 10000L);log.info("sendtime is {}", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now()));log.info("sendResult is{}", sendResult);}
}
创建好订单之后,将订单发送到延迟队列
public class orderCreator {public void create( ... ) {...delayProduce.sendDelayMessage(CERTAIN_TOPIC,JSON.toJSONString(order),15 // 15代表rocketmq中第15级的延时时长,20分钟);...}
}
延时队列的消费者,来处理到时间的订单消息
@RocketMQMessageListener(topic = TOPIC,consumerGroup = CONSUMERGROUP
)
public class OrderDelayConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String message) {检测订单是否已经支付成功,如果支付过了,就不管了如果仍然没有支付,就取消订单,对订单进行关闭if (取消成功) {创建message,发送给状态机,转换订单状态为已取消}}
}
其他方式处理订单到期关闭
定时任务
通过定时任务,去定期扫描到期的订单,做关单操作。比如使用xxl-job。
这样的处理方式的优点是:
- 简单 实现容易
缺点也显而易见:
- 关单时机不精确,