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

本文介绍了一个基于Java的订单监控任务实现方案,该任务通过定时扫描待付款订单并在超时后自动取消订单。文章详细解释了如何根据不同类型的订单设置不同的超时阈值,并展示了如何利用Redis缓存和Spring框架来实现这一功能。

/*** 订单监控类

* 定时扫描所有待付款订单,超时自动取消

* Created by huangbaidong

* 2017/3/29.*/@Componentpublic classOrderMonitorJob {

@ResourceprivateRedisUtil redisUtil;

@ResourceprivateBsdOrderService bsdOrderService;

@ResourceprivateBsdDFKOrderCacheManager bsdDFKOrderCacheManager;private boolean isLock = false;/*** 待付款订单定时扫描类

* 定时扫描所有待付款订单,超时自动取消*/

public voidpaymentTimeoutScan() {if(!isLock) {//加锁,防止定时器重复执行,

isLock = true;try{

List orders =bsdDFKOrderCacheManager.getAll();if(BlankUtil.isNotEmpty(orders)) {

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

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值