文章目錄
- 前言
- 一、場景?
- 二、使用步驟
- 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。
這樣的處理方式的優點是:
- 簡單 實現容易
缺點也顯而易見:
- 關單時機不精確,