Explorar el Código

任务Cron更新逻辑优化,改为rescheduleJob,同时防止cron重复设置;

xueli.xue hace 8 años
padre
commit
25cf93fdc2

+ 3 - 0
README.md Ver fichero

@@ -847,6 +847,9 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
847 847
 - 5、执行参数编辑时丢失问题修复;
848 848
 - 6、新增任务测试Demo,方便在开发时进行任务逻辑测试;
849 849
 
850
+#### 6.16 版本 V1.8.0 特性[Coding]
851
+- 1、任务Cron更新逻辑优化,改为rescheduleJob,同时防止cron重复设置;
852
+
850 853
 #### TODO LIST
851 854
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
852 855
 - 2、任务分片:一个任务被拆分成N个独立的任务单元,然后由分布式部署的执行器分别执行某一个或几个分片单元;

+ 34 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java Ver fichero

@@ -193,25 +193,40 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
193 193
         
194 194
         // TriggerKey : name + group
195 195
         TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
196
-        JobKey jobKey = new JobKey(jobName, jobGroup);
197
-        
198
-        // CronTrigger : TriggerKey + cronExpression
199
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
200
-        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
201
-        
202
-        //scheduler.rescheduleJob(triggerKey, cronTrigger);
203
-        
204
-        // JobDetail-JobDataMap fresh
205
-        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
206
-    	/*JobDataMap jobDataMap = jobDetail.getJobDataMap();
207
-    	jobDataMap.clear();
208
-    	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/
209
-    	
210
-    	// Trigger fresh
211
-    	HashSet<Trigger> triggerSet = new HashSet<Trigger>();
212
-    	triggerSet.add(cronTrigger);
213
-        
214
-        scheduler.scheduleJob(jobDetail, triggerSet, true);
196
+        CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
197
+
198
+        if (oldTrigger != null) {
199
+            // avoid repeat
200
+            String oldCron = oldTrigger.getCronExpression();
201
+            if (oldCron.equals(cronExpression)){
202
+                return true;
203
+            }
204
+
205
+            // CronTrigger : TriggerKey + cronExpression
206
+            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
207
+            oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
208
+
209
+            // rescheduleJob
210
+            scheduler.rescheduleJob(triggerKey, oldTrigger);
211
+        } else {
212
+            // CronTrigger : TriggerKey + cronExpression
213
+            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
214
+            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
215
+
216
+            // JobDetail-JobDataMap fresh
217
+            JobKey jobKey = new JobKey(jobName, jobGroup);
218
+            JobDetail jobDetail = scheduler.getJobDetail(jobKey);
219
+            /*JobDataMap jobDataMap = jobDetail.getJobDataMap();
220
+            jobDataMap.clear();
221
+            jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/
222
+
223
+            // Trigger fresh
224
+            HashSet<Trigger> triggerSet = new HashSet<Trigger>();
225
+            triggerSet.add(cronTrigger);
226
+
227
+            scheduler.scheduleJob(jobDetail, triggerSet, true);
228
+        }
229
+
215 230
         logger.info(">>>>>>>>>>> resumeJob success, JobGroup:{}, JobName:{}", jobGroup, jobName);
216 231
         return true;
217 232
     }