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;
}
}
}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM