Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

 更新时间:2025年01月10日 12:17:35   作者:rain_is_my_name  
这篇文章主要介绍了Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单,本文给大家介绍的非常详细,需要的朋友可以参考下

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分钟后执行定时任务~
创作不易,尊重知识,转载请附带本文链接

到此这篇关于Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单的文章就介绍到这了,更多相关Springboot ThreadPoolTaskScheduler线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 枚举类型的自动转换的实现

    SpringBoot 枚举类型的自动转换的实现

    一般我们在数据库都会定义数值型的枚举常量,不管是序列化还是反序列化都是需要我们手动去转换成枚举类型的,本文主要介绍了Spring Boot 枚举类型的自动转换,感兴趣的可以了解一下
    2022-03-03
  • SpringBoot实现初始化的三种策略模式

    SpringBoot实现初始化的三种策略模式

    本文主要介绍了SpringBoot实现初始化的三种策略模式,包括默认初始化策略、懒加载初始化策略和自定义初始化策略,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 详解SpringBoot中的index首页的访问、自定义Favicon图标

    详解SpringBoot中的index首页的访问、自定义Favicon图标

    这篇文章主要介绍了SpringBoot中的index首页的访问、自定义Favicon图标,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • JFinal使用ajaxfileupload实现图片上传及预览

    JFinal使用ajaxfileupload实现图片上传及预览

    这篇文章主要为大家详细介绍了JFinal使用ajaxfileupload实现图片上传及预览,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Java中使用Filter过滤器的方法

    Java中使用Filter过滤器的方法

    Filter过滤器是javaWeb层面的,它跟Servlet类似,每次前端请求,首先进入的是过滤器,我们必须实现Filter接口,重写三个方法,才能使用Filter过滤器,需要的朋友可以参考下
    2021-06-06
  • Maven的配置文件pom.xml详解(含常用plugin)

    Maven的配置文件pom.xml详解(含常用plugin)

    pom.xml是Maven项目的核心配置文件,它是 项目对象模型 - Project Object Model(POM)的缩写,本文我们将全面解析pom.xml,了解其结构和属性,以及如何使用它来管理项目,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Mybatis-plus 双主键的实现示例

    Mybatis-plus 双主键的实现示例

    本文主要介绍了Mybatis-plus 双主键的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Java并发(Runnable+Thread)实现硬盘文件搜索功能

    Java并发(Runnable+Thread)实现硬盘文件搜索功能

    这篇文章主要介绍了Java并发(Runnable+Thread)实现硬盘文件搜索,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring Cache的使用示例详解

    Spring Cache的使用示例详解

    SpringCache是构建在SpringContext基础上的缓存实现,提供了多种缓存注解,如@Cachable、@CacheEvict、@CachePut等,本文通过实例代码介绍了Spring Cache的使用,感兴趣的朋友一起看看吧
    2025-01-01
  • MyBatis拦截器动态替换表名的方法详解

    MyBatis拦截器动态替换表名的方法详解

    因为我们持久层框架更多地使用MyBatis,那我们就借助于MyBatis的拦截器来完成我们的功能,这篇文章主要给大家介绍了关于MyBatis拦截器动态替换表名的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论