SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享
方案一:定時(shí)任務(wù)
利用Spring Boot中的@Scheduled
注解,我們可以輕松地實(shí)現(xiàn)定時(shí)任務(wù)。該任務(wù)將周期性地掃描數(shù)據(jù)庫(kù),檢查未支付的訂單,如果訂單生成30分鐘未支付,則自動(dòng)取消。
@Component public class OrderCancelSchedule { @Autowired private OrderService orderService; @Scheduled(cron = "0 0/1 * * * ?") public void cancelUnpaidOrders() { List<Order> unpaidOrders = orderService.getUnpaidOrders(); unpaidOrders.forEach(order -> { if (order.getCreationTime().plusMinutes(30).isBefore(LocalDateTime.now())) { orderService.cancelOrder(order.getId()); } }); } }
方案二:延遲隊(duì)列
使用消息隊(duì)列(如RabbitMQ)的延遲隊(duì)列功能,當(dāng)訂單生成時(shí)將訂單ID推送到延遲隊(duì)列,設(shè)置30分鐘后過期,過期后消費(fèi)該消息,取消訂單。
@Service public class OrderService { @Autowired private RabbitTemplate rabbitTemplate; public void createOrder(Order order) { // 保存訂單至數(shù)據(jù)庫(kù) saveOrderToDB(order); // 將訂單ID推送至延遲隊(duì)列 rabbitTemplate.convertAndSend("orderDelayExchange", "orderDelayKey", order.getId(), message -> { message.getMessageProperties().setDelay(30 * 60 * 1000); // 設(shè)置延遲時(shí)間 return message; }); } } @Component @RabbitListener(queues = "orderDelayQueue") public class OrderDelayConsumer { @Autowired private OrderService orderService; @RabbitHandler public void process(String orderId) { // 取消訂單 orderService.cancelOrder(orderId); } }
方案三:Redis過期事件
利用Redis的鍵過期事件功能,當(dāng)訂單生成時(shí)在Redis中存儲(chǔ)一個(gè)鍵,設(shè)置30分鐘過期,鍵過期時(shí)通過Redis的過期事件通知功能觸發(fā)訂單取消操作。
@Service public class OrderService { @Autowired private StringRedisTemplate redisTemplate; public void createOrder(Order order) { // 保存訂單至數(shù)據(jù)庫(kù) saveOrderToDB(order); // 在Redis中存儲(chǔ)一個(gè)鍵,設(shè)置30分鐘過期 redisTemplate.opsForValue().set("order:" + order.getId(), order.getId(), 30, TimeUnit.MINUTES); } // 當(dāng)鍵過期時(shí),Redis會(huì)自動(dòng)調(diào)用該方法(需要配置Redis的過期事件通知功能) public void onOrderKeyExpired(String orderId) { cancelOrder(orderId); } }
補(bǔ)充一下配置Redis的過期事件通知功能如下: Redis的鍵過期通知是一種典型的發(fā)布-訂閱模式。在Redis中,我們可以訂閱到某些特定的事件。鍵過期事件就是其中之一。但需要注意,要使用這個(gè)功能,需要確保你的Redis服務(wù)器開啟了相關(guān)配置。
下面是具體的步驟和示例:
- 首先需要確保Redis的配置文件(通常是
redis.conf
)中開啟了鍵空間通知功能。你可以通過在配置文件中添加或修改如下配置實(shí)現(xiàn):
notify-keyspace-events "Ex"
這里的"Ex"
表示只監(jiān)聽鍵過期事件。如果需要監(jiān)聽其他類型的事件,可以參考Redis官方文檔進(jìn)行配置。
- 然后在Spring Boot應(yīng)用中,可以使用
RedisMessageListenerContainer
來(lái)訂閱Redis的鍵過期事件,并指定回調(diào)方法進(jìn)行處理。示例如下:
@Configuration public class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean RedisMessageListenerContainer container() { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(redisConnectionFactory); // 訂閱所有db的過期事件 container.addMessageListener(new MessageListener() { @Override public void onMessage(Message message, byte[] pattern) { String expiredKey = message.toString(); if (expiredKey.startsWith("order:")) { // 處理訂單超時(shí)邏輯 String orderId = expiredKey.split(":")[1]; // 這里調(diào)用你的服務(wù)類方法,處理訂單超時(shí)邏輯 // orderService.cancelOrder(orderId); } } }, new PatternTopic("__keyevent@*__:expired")); return container; } }
在這個(gè)示例中,"__keyevent@*__:expired"
是一個(gè)模式匹配的主題,它可以匹配所有數(shù)據(jù)庫(kù)的鍵過期事件。當(dāng)一個(gè)鍵過期時(shí),onMessage
方法會(huì)被調(diào)用,你可以在這里加入你的邏輯來(lái)處理訂單的超時(shí)取消。
請(qǐng)注意,這里的代碼只是一個(gè)基本示例。在實(shí)際使用中,你可能需要根據(jù)自己的需要對(duì)代碼進(jìn)行相應(yīng)的調(diào)整和優(yōu)化。
總結(jié)
以上三種方案都可以實(shí)現(xiàn)訂單在30分鐘內(nèi)未支付則自動(dòng)取消的需求。根據(jù)實(shí)際業(yè)務(wù)需求、系統(tǒng)負(fù)載和其他因素,可以選擇最適合自己系統(tǒng)的實(shí)現(xiàn)方案。每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況權(quán)衡。
以上就是SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot實(shí)現(xiàn)訂單自動(dòng)取消的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springIOC的使用流程及spring中使用類型轉(zhuǎn)換器的方式
Spring IOC是Spring框架的核心原理之一,它是一種軟件設(shè)計(jì)模式,用于管理應(yīng)用程序中的對(duì)象依賴關(guān)系,這篇文章主要介紹了springIOC的使用流程以及spring中如何使用類型轉(zhuǎn)換器,需要的朋友可以參考下2023-06-06Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn)
這篇文章主要介紹了Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn),幫助大家選擇合適的自動(dòng)構(gòu)建工具,更好的構(gòu)建項(xiàng)目,感興趣的朋友可以了解下2020-10-10java對(duì)圖片進(jìn)行壓縮和resize縮放的方法
本篇文章主要介紹了java對(duì)圖片進(jìn)行壓縮和resize調(diào)整的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07為什么rest接口返回json建議采用下劃線形式,不要用駝峰
為什么rest接口返回json建議采用下劃線形式,不要用駝峰?今天小編就來(lái)為大家說(shuō)明一下原因,還等什么?一起跟隨小編過來(lái)看看吧2020-09-09Intellj Idea中的maven工程Java文件顏色不對(duì),未被識(shí)別的解決
這篇文章主要介紹了Intellj Idea中的maven工程Java文件顏色不對(duì),未被識(shí)別的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-08-08Springboot webscoket自定義定時(shí)器
這篇文章主要介紹了Springboot webscoket自定義定時(shí)器問題,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來(lái)一種解題優(yōu)化的思路2023-01-01Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解
這篇文章主要為大家?介紹了Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟
由于導(dǎo)入jar包項(xiàng)目存在很多不確定的問題,導(dǎo)致每次都需要調(diào)試、配置好多遍,對(duì)此特意記錄下來(lái),這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入jar包的相關(guān)資料,需要的朋友可以參考下2024-01-01