Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動(dòng)取消訂單
ThreadPoolTaskScheduler線程池實(shí)現(xiàn)15分鐘不操作自動(dòng)取消訂單
概要
使用ThreadPoolTaskScheduler的schedule方法實(shí)現(xiàn)當(dāng)前操作15分鐘后執(zhí)行定時(shí)任務(wù)
1,創(chuàng)建訂單后觸發(fā)
1.1 Impl層
private final OrderSchedulerService schedulerService; @Override @Transactional(rollbackFor = Exception.class) public R saveHotelOrder(HotelOrderPO po) { HotelOrder order = new HotelOrder(); boolean saveOrUpdate = saveOrUpdate(order); // 補(bǔ)充自己的開發(fā)邏輯 if(條件滿足){ schedulerService.createScheduler(order.getId()); } return R.data(order.getId()); }
1.2 OrderSchedulerService(核心類)
@Slf4j @Service @AllArgsConstructor public class OrderSchedulerService { private final HotelOrderMapper hotelOrderMapper; private final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); private final ConcurrentHashMap<Long, ScheduledFuture<?>> orderTasks = new ConcurrentHashMap<>(); // 模擬用戶新增訂單 public void createScheduler(Long orderId) { taskScheduler.initialize(); // 15分鐘后執(zhí)行 Instant plus = Instant.now().plus(Duration.ofMinutes(15)); ScheduledFuture<?> future = taskScheduler.schedule(() -> { if (isOrderActive(orderId)) { // 取消訂單 HotelOrder order = hotelOrderMapper.selectById(orderId); order.setStatus(CommonConstant.INT_5); hotelOrderMapper.updateById(order); log.info("15分鐘未操作,自動(dòng)取消訂單:{}", order.getSerialNumber()); } }, plus); orderTasks.put(orderId, future); } // 訂單取消時(shí),取消訂單的15分鐘定時(shí)任務(wù) public void cancelScheduler(Long orderId) { ScheduledFuture<?> future = orderTasks.get(orderId); if (future != null && !future.isDone()) { future.cancel(false); orderTasks.remove(orderId); log.info("15分鐘有支付操作,取消訂單定時(shí)任務(wù):{}", orderId); } } // 檢查訂單是否仍在任務(wù)列表中(模擬訂單未刪除) private boolean isOrderActive(Long orderId) { return orderTasks.containsKey(orderId); } }
2,訂單手動(dòng)取消則取消該訂單對應(yīng)的定時(shí)任務(wù)
1.1 Impl層
@Override public R cancelByIdForMini(Long id, String reason) { // 寫自己的取消業(yè)務(wù) // 訂單取消時(shí),取消訂單的15分鐘定時(shí)任務(wù) log.info(" 訂單取消時(shí),取消訂單的15分鐘定時(shí)任務(wù):{}", id.toString()); schedulerService.cancelScheduler(id); return R.status(true); }
總結(jié)
使用ThreadPoolTaskScheduler的schedule方法實(shí)現(xiàn)當(dāng)前操作15分鐘后執(zhí)行定時(shí)任務(wù)~創(chuàng)作不易,尊重知識(shí),轉(zhuǎn)載請附帶本文鏈接
到此這篇關(guān)于Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動(dòng)取消訂單的文章就介紹到這了,更多相關(guān)Springboot ThreadPoolTaskScheduler線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們在數(shù)據(jù)庫都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03SpringBoot實(shí)現(xiàn)初始化的三種策略模式
本文主要介紹了SpringBoot實(shí)現(xiàn)初始化的三種策略模式,包括默認(rèn)初始化策略、懶加載初始化策略和自定義初始化策略,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)
這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽
這篇文章主要為大家詳細(xì)介紹了JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Maven的配置文件pom.xml詳解(含常用plugin)
pom.xml是Maven項(xiàng)目的核心配置文件,它是 項(xiàng)目對象模型 - Project Object Model(POM)的縮寫,本文我們將全面解析pom.xml,了解其結(jié)構(gòu)和屬性,以及如何使用它來管理項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2024-08-08Mybatis-plus 雙主鍵的實(shí)現(xiàn)示例
本文主要介紹了Mybatis-plus 雙主鍵的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Java并發(fā)(Runnable+Thread)實(shí)現(xiàn)硬盤文件搜索功能
這篇文章主要介紹了Java并發(fā)(Runnable+Thread)實(shí)現(xiàn)硬盤文件搜索,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01MyBatis攔截器動(dòng)態(tài)替換表名的方法詳解
因?yàn)槲覀兂志脤涌蚣芨嗟厥褂肕yBatis,那我們就借助于MyBatis的攔截器來完成我們的功能,這篇文章主要給大家介紹了關(guān)于MyBatis攔截器動(dòng)態(tài)替換表名的相關(guān)資料,需要的朋友可以參考下2022-04-04