Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單
ThreadPoolTaskScheduler線程池實(shí)現(xiàn)15分鐘不操作自動取消訂單
概要
使用ThreadPoolTaskScheduler的schedule方法實(shí)現(xiàn)當(dāng)前操作15分鐘后執(zhí)行定時任務(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分鐘未操作,自動取消訂單:{}", order.getSerialNumber());
}
}, plus);
orderTasks.put(orderId, future);
}
// 訂單取消時,取消訂單的15分鐘定時任務(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分鐘有支付操作,取消訂單定時任務(wù):{}", orderId);
}
}
// 檢查訂單是否仍在任務(wù)列表中(模擬訂單未刪除)
private boolean isOrderActive(Long orderId) {
return orderTasks.containsKey(orderId);
}
}2,訂單手動取消則取消該訂單對應(yīng)的定時任務(wù)
1.1 Impl層
@Override
public R cancelByIdForMini(Long id, String reason) {
// 寫自己的取消業(yè)務(wù)
// 訂單取消時,取消訂單的15分鐘定時任務(wù)
log.info(" 訂單取消時,取消訂單的15分鐘定時任務(wù):{}", id.toString());
schedulerService.cancelScheduler(id);
return R.status(true);
}總結(jié)
使用ThreadPoolTaskScheduler的schedule方法實(shí)現(xiàn)當(dāng)前操作15分鐘后執(zhí)行定時任務(wù)~創(chuàng)作不易,尊重知識,轉(zhuǎn)載請附帶本文鏈接
到此這篇關(guān)于Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動取消訂單的文章就介紹到這了,更多相關(guān)Springboot ThreadPoolTaskScheduler線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 枚舉類型的自動轉(zhuǎn)換的實(shí)現(xiàn)
一般我們在數(shù)據(jù)庫都會定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動轉(zhuǎn)換,感興趣的可以了解一下2022-03-03
SpringBoot實(shí)現(xiàn)初始化的三種策略模式
本文主要介紹了SpringBoot實(shí)現(xiàn)初始化的三種策略模式,包括默認(rèn)初始化策略、懶加載初始化策略和自定義初始化策略,具有一定的參考價值,感興趣的可以了解一下2024-12-12
詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)
這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽
這篇文章主要為大家詳細(xì)介紹了JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
Maven的配置文件pom.xml詳解(含常用plugin)
pom.xml是Maven項目的核心配置文件,它是 項目對象模型 - Project Object Model(POM)的縮寫,本文我們將全面解析pom.xml,了解其結(jié)構(gòu)和屬性,以及如何使用它來管理項目,感興趣的朋友跟隨小編一起看看吧2024-08-08
Mybatis-plus 雙主鍵的實(shí)現(xiàn)示例
本文主要介紹了Mybatis-plus 雙主鍵的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Java并發(fā)(Runnable+Thread)實(shí)現(xiàn)硬盤文件搜索功能
這篇文章主要介紹了Java并發(fā)(Runnable+Thread)實(shí)現(xiàn)硬盤文件搜索,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

