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;

}

}

}

}

在Spring Boot应用中集成Quartz框架,你可以创建个Job类,并通过Spring的Bean自动装配将其注册到Quartz的Scheduler中。当个Job执行完毕后,如果需要按照特定的调度规则自动触发下个Job,可以配置每个Job的执行策略。 首先,你需要设置好JobDetail,指定job的名称、组名以及执行的具体业务逻辑。然后,通过 CronTrigger 或者其他的定表达式定义Job的触发间,比如每小执行次: ```java // JobDetail配置 JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "defaultGroup") .build(); // CronTrigger配置,这里每小触发 CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule("0 0 * * * ?"); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "defaultGroup") .usingJobData("nextJob", "nextJobName") // 存储下执行的Job名称 .startNow() // 开始立即执行 .withSchedule(schedule) .build(); scheduler.scheduleJob(job, trigger); ``` 在`MyJob`类中,你可以获取上次触发的Job名称,执行当前任务后,根据这个名称找到下个Job并执行: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { String nextJobName = (String) context.getMergedJobDataMap().get("nextJob"); if (!StringUtils.isEmpty(nextJobName)) { // 使用 Quartz 的 JobKey 来查找 Job try { scheduler.triggerJob(JobKeys.jobKey(nextJobName, "defaultGroup")); } catch (SchedulerException e) { // 捕获异常并处理 log.error("Failed to trigger next job: {}", nextJobName, e); } } // 执行你的实际业务逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值