From 25cf93fdc234f8d339f5ff6eccfc90f32eb9caf5 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Wed, 24 May 2017 11:41:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1Cron=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=B9=E4=B8=BA?= =?UTF-8?q?rescheduleJob=EF=BC=8C=E5=90=8C=E6=97=B6=E9=98=B2=E6=AD=A2cron?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E8=AE=BE=E7=BD=AE=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++ .../core/schedule/XxlJobDynamicScheduler.java | 53 ++++++++++++------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 04cdc014..beb8d71e 100644 --- a/README.md +++ b/README.md @@ -847,6 +847,9 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 5、执行参数编辑时丢失问题修复; - 6、新增任务测试Demo,方便在开发时进行任务逻辑测试; +#### 6.16 版本 V1.8.0 特性[Coding] +- 1、任务Cron更新逻辑优化,改为rescheduleJob,同时防止cron重复设置; + #### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; - 2、任务分片:一个任务被拆分成N个独立的任务单元,然后由分布式部署的执行器分别执行某一个或几个分片单元; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java index fdb9539e..8cbd73af 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java @@ -193,25 +193,40 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); - JobKey jobKey = new JobKey(jobName, jobGroup); - - // CronTrigger : TriggerKey + cronExpression - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); - CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); - - //scheduler.rescheduleJob(triggerKey, cronTrigger); - - // JobDetail-JobDataMap fresh - JobDetail jobDetail = scheduler.getJobDetail(jobKey); - /*JobDataMap jobDataMap = jobDetail.getJobDataMap(); - jobDataMap.clear(); - jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/ - - // Trigger fresh - HashSet triggerSet = new HashSet(); - triggerSet.add(cronTrigger); - - scheduler.scheduleJob(jobDetail, triggerSet, true); + CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey); + + if (oldTrigger != null) { + // avoid repeat + String oldCron = oldTrigger.getCronExpression(); + if (oldCron.equals(cronExpression)){ + return true; + } + + // CronTrigger : TriggerKey + cronExpression + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); + oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); + + // rescheduleJob + scheduler.rescheduleJob(triggerKey, oldTrigger); + } else { + // CronTrigger : TriggerKey + cronExpression + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); + CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); + + // JobDetail-JobDataMap fresh + JobKey jobKey = new JobKey(jobName, jobGroup); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + /*JobDataMap jobDataMap = jobDetail.getJobDataMap(); + jobDataMap.clear(); + jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/ + + // Trigger fresh + HashSet triggerSet = new HashSet(); + triggerSet.add(cronTrigger); + + scheduler.scheduleJob(jobDetail, triggerSet, true); + } + logger.info(">>>>>>>>>>> resumeJob success, JobGroup:{}, JobName:{}", jobGroup, jobName); return true; }