ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单
概要
使用ThreadPoolTaskScheduler的schedule方法实现当前操作15分钟后执行定时任务
1,创建订单后触发
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);
// 补充自己的开发逻辑
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分钟后执行
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分钟定时任务
public void cancelScheduler(Long orderId) {
ScheduledFuture<?> future = orderTasks.get(orderId);
if (future != null && !future.isDone()) {
future.cancel(false);
orderTasks.remove(orderId);
log.info("15分钟有支付操作,取消订单定时任务:{}", orderId);
}
}
// 检查订单是否仍在任务列表中(模拟订单未删除)
private boolean isOrderActive(Long orderId) {
return orderTasks.containsKey(orderId);
}
}
2,订单手动取消则取消该订单对应的定时任务
1.1 Impl层
@Override
public R cancelByIdForMini(Long id, String reason) {
// 写自己的取消业务
// 订单取消时,取消订单的15分钟定时任务
log.info(" 订单取消时,取消订单的15分钟定时任务:{}", id.toString());
schedulerService.cancelScheduler(id);
return R.status(true);
}
总结
使用ThreadPoolTaskScheduler的schedule方法实现当前操作15分钟后执行定时任务~
创作不易,尊重知识,转载请附带本文链接