• quartz 防止上一任务未执行完毕,下一时间点重复执行


    /**
     * 订单监控类
     * 定时扫描所有待付款订单,超时自动取消
     * Created by huangbaidong
     * 2017/3/29.
     */
    @Component
    public class OrderMonitorJob {
    
        @Resource
        private RedisUtil redisUtil;
    
        @Resource
        private BsdOrderService bsdOrderService;
    
        @Resource
        private BsdDFKOrderCacheManager bsdDFKOrderCacheManager;
    
        private boolean isLock = false;
    
        /**
         * 待付款订单定时扫描类
         * 定时扫描所有待付款订单,超时自动取消
         */
        public void paymentTimeoutScan() {
            if(!isLock) {
                //加锁,防止定时器重复执行,
                isLock = true;
                try {
                    List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll();
                    if (BlankUtil.isNotEmpty(orders)) {
    
                        List<String> removeIds = new ArrayList<>();//需要移除的订单
    
                        for (BsdDFKOrderCacheEntity order : orders) {
    
                            if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) {
                                boolean isExpire = false;
                                if (order.isHasPromotion() == 1) {
                                    //如果是有促销规则的订单,1小时未支付,自动取消订单
                                    if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) {
                                        isExpire = true;
                                    }
                                } else {
                                    //如果是没有促销规则的订单,24小时未支付,自动取消订单
                                    if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) {
                                        isExpire = true;
                                    }
                                }
                                if (isExpire) {
    
                                    //1、自动取消订单(操作人ID传0)
                                    bsdOrderService.cancel(order.getId(), 0l);
    
                                    //2、记录过期的订单,将订单从缓存中清除
                                    removeIds.add(order.getId().toString());
    
                                    System.out.println("------>订单[" + order.getCode() + "]超时未付款自动取消订单");
                                }
                            } else {
                                //不是待付款状态的订单,记录从缓存中清除
                                removeIds.add(order.getId().toString());
                            }
                        }
    
                        //将不是待支付状态的订单,以及过期的未支付的订单从缓存中删除
                        if (BlankUtil.isNotEmpty(removeIds)) {
                            bsdDFKOrderCacheManager.removeFromCache(removeIds);
                        }
                    }
                } finally {
                    //运行完后释放锁
                    isLock = false;
                }
            }
        }
    
    }
    /**
    * 订单监控类
    * 定时扫描所有待付款订单,超时自动取消
    * Created by huangbaidong
    * 2017/3/29.
    */
    @Component
    public class OrderMonitorJob {

    @Resource
    private RedisUtil redisUtil;

    @Resource
    private BsdOrderService bsdOrderService;

    @Resource
    private BsdDFKOrderCacheManager bsdDFKOrderCacheManager;

    private boolean isLock = false;

    /**
    * 待付款订单定时扫描类
    * 定时扫描所有待付款订单,超时自动取消
    */
    public void paymentTimeoutScan() {
    if(!isLock) {
    //加锁,防止定时器重复执行,
    isLock = true;
    try {
    List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll();
    if (BlankUtil.isNotEmpty(orders)) {

    List<String> removeIds = new ArrayList<>();//需要移除的订单

    for (BsdDFKOrderCacheEntity order : orders) {

    if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) {
    boolean isExpire = false;
    if (order.isHasPromotion() == 1) {
    //如果是有促销规则的订单,1小时未支付,自动取消订单
    if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) {
    isExpire = true;
    }
    } else {
    //如果是没有促销规则的订单,24小时未支付,自动取消订单
    if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) {
    isExpire = true;
    }
    }
    if (isExpire) {

    //1、自动取消订单(操作人ID0)
    bsdOrderService.cancel(order.getId(), 0l);

    //2、记录过期的订单,将订单从缓存中清除
    removeIds.add(order.getId().toString());

    System.out.println("------>订单[" + order.getCode() + "]超时未付款自动取消订单");
    }
    } else {
    //不是待付款状态的订单,记录从缓存中清除
    removeIds.add(order.getId().toString());
    }
    }

    //将不是待支付状态的订单,以及过期的未支付的订单从缓存中删除
    if (BlankUtil.isNotEmpty(removeIds)) {
    bsdDFKOrderCacheManager.removeFromCache(removeIds);
    }
    }
    } finally {
    //运行完后释放锁
    isLock = false;
    }
    }
    }

    }
  • 相关阅读:
    Android学习笔记之-----讯飞语音识别实例化RecognizerDialog参数出现错误的解决方法
    java基本数据类型取值范围
    中国教育
    git push --help
    cherry Tree的严重漏洞
    程序的核心是什么
    BeanUtils.getProperty性能分析
    Java各种反射性能对比
    Spring AOP无法拦截Controller中的方法
    Mock单元测试
  • 原文地址:https://www.cnblogs.com/cocoat/p/6654632.html
Copyright © 2020-2023  润新知