Bläddra i källkod

调度组件优化:针对永远不会触发的Cron禁止配置和启动;任务Cron最后一次触发后再也不会触发时,比如一次性任务,主动停止相关任务;

xuxueli 6 år sedan
förälder
incheckning
5b280137fb

+ 1 - 0
doc/XXL-JOB官方文档.md Visa fil

1519
 - 8、[ING]任务、执行器数据全量本地缓存;新增消息表广播通知;
1519
 - 8、[ING]任务、执行器数据全量本地缓存;新增消息表广播通知;
1520
 - 9、[ING]任务触发组件优化,常规1s预加载一次,轮空时主动休眠4s;
1520
 - 9、[ING]任务触发组件优化,常规1s预加载一次,轮空时主动休眠4s;
1521
 - 10、注册监控线程优化,降低死锁几率;
1521
 - 10、注册监控线程优化,降低死锁几率;
1522
+- 11、调度组件优化:针对永远不会触发的Cron禁止配置和启动;任务Cron最后一次触发后再也不会触发时,比如一次性任务,主动停止相关任务;
1522
 
1523
 
1523
 
1524
 
1524
 ### TODO LIST
1525
 ### TODO LIST

+ 27 - 18
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Visa fil

78
                                     // 过期超5s:本地忽略,当前时间开始计算下次触发时间
78
                                     // 过期超5s:本地忽略,当前时间开始计算下次触发时间
79
 
79
 
80
                                     // fresh next
80
                                     // fresh next
81
-                                    jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
82
-                                    jobInfo.setTriggerNextTime(
83
-                                            new CronExpression(jobInfo.getJobCron())
84
-                                                    .getNextValidTimeAfter(new Date())
85
-                                                    .getTime()
86
-                                    );
81
+                                    Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date());
82
+                                    if (nextValidTime != null) {
83
+                                        jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
84
+                                        jobInfo.setTriggerNextTime(nextValidTime.getTime());
85
+                                    } else {
86
+                                        jobInfo.setTriggerStatus(0);
87
+                                        jobInfo.setTriggerLastTime(0);
88
+                                        jobInfo.setTriggerNextTime(0);
89
+                                    }
87
 
90
 
88
                                 } else if (nowTime > jobInfo.getTriggerNextTime()) {
91
                                 } else if (nowTime > jobInfo.getTriggerNextTime()) {
89
                                     // 过期5s内 :立即触发一次,当前时间开始计算下次触发时间;
92
                                     // 过期5s内 :立即触发一次,当前时间开始计算下次触发时间;
110
                                         pushTimeRing(ringSecond, jobInfo.getId());
113
                                         pushTimeRing(ringSecond, jobInfo.getId());
111
 
114
 
112
                                         // 3、fresh next
115
                                         // 3、fresh next
113
-                                        jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
114
-                                        jobInfo.setTriggerNextTime(
115
-                                                new CronExpression(jobInfo.getJobCron())
116
-                                                        .getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
117
-                                                        .getTime()
118
-                                        );
116
+                                        Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()));
117
+                                        if (nextValidTime != null) {
118
+                                            jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
119
+                                            jobInfo.setTriggerNextTime(nextValidTime.getTime());
120
+                                        } else {
121
+                                            jobInfo.setTriggerStatus(0);
122
+                                            jobInfo.setTriggerLastTime(0);
123
+                                            jobInfo.setTriggerNextTime(0);
124
+                                        }
119
 
125
 
120
                                     }
126
                                     }
121
 
127
 
129
                                     pushTimeRing(ringSecond, jobInfo.getId());
135
                                     pushTimeRing(ringSecond, jobInfo.getId());
130
 
136
 
131
                                     // 3、fresh next
137
                                     // 3、fresh next
132
-                                    jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
133
-                                    jobInfo.setTriggerNextTime(
134
-                                            new CronExpression(jobInfo.getJobCron())
135
-                                                    .getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
136
-                                                    .getTime()
137
-                                    );
138
+                                    Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()));
139
+                                    if (nextValidTime != null) {
140
+                                        jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
141
+                                        jobInfo.setTriggerNextTime(nextValidTime.getTime());
142
+                                    } else {
143
+                                        jobInfo.setTriggerStatus(0);
144
+                                        jobInfo.setTriggerLastTime(0);
145
+                                        jobInfo.setTriggerNextTime(0);
146
+                                    }
138
 
147
 
139
                                 }
148
                                 }
140
 
149
 

+ 10 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Visa fil

194
 		long nextTriggerTime = exists_jobInfo.getTriggerNextTime();
194
 		long nextTriggerTime = exists_jobInfo.getTriggerNextTime();
195
 		if (exists_jobInfo.getTriggerStatus() == 1 && !jobInfo.getJobCron().equals(exists_jobInfo.getJobCron()) ) {
195
 		if (exists_jobInfo.getTriggerStatus() == 1 && !jobInfo.getJobCron().equals(exists_jobInfo.getJobCron()) ) {
196
 			try {
196
 			try {
197
-				nextTriggerTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)).getTime();
197
+				Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
198
+				if (nextValidTime == null) {
199
+					return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_never_fire"));
200
+				}
201
+				nextTriggerTime = nextValidTime.getTime();
198
 			} catch (ParseException e) {
202
 			} catch (ParseException e) {
199
 				logger.error(e.getMessage(), e);
203
 				logger.error(e.getMessage(), e);
200
 				return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
204
 				return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
240
 		// next trigger time (5s后生效,避开预读周期)
244
 		// next trigger time (5s后生效,避开预读周期)
241
 		long nextTriggerTime = 0;
245
 		long nextTriggerTime = 0;
242
 		try {
246
 		try {
243
-			nextTriggerTime = new CronExpression(xxlJobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)).getTime();
247
+			Date nextValidTime = new CronExpression(xxlJobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));
248
+			if (nextValidTime == null) {
249
+				return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_never_fire"));
250
+			}
251
+			nextTriggerTime = nextValidTime.getTime();
244
 		} catch (ParseException e) {
252
 		} catch (ParseException e) {
245
 			logger.error(e.getMessage(), e);
253
 			logger.error(e.getMessage(), e);
246
 			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
254
 			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());

+ 1 - 0
xxl-job-admin/src/main/resources/i18n/message.properties Visa fil

109
 jobinfo_field_gluetype=运行模式
109
 jobinfo_field_gluetype=运行模式
110
 jobinfo_field_executorparam=任务参数
110
 jobinfo_field_executorparam=任务参数
111
 jobinfo_field_cron_unvalid=Cron格式非法
111
 jobinfo_field_cron_unvalid=Cron格式非法
112
+jobinfo_field_cron_never_fire=Cron非法,永远不会触发
112
 jobinfo_field_author=负责人
113
 jobinfo_field_author=负责人
113
 jobinfo_field_timeout=任务超时时间
114
 jobinfo_field_timeout=任务超时时间
114
 jobinfo_field_alarmemail=报警邮件
115
 jobinfo_field_alarmemail=报警邮件

+ 1 - 0
xxl-job-admin/src/main/resources/i18n/message_en.properties Visa fil

110
 jobinfo_field_gluetype=GLUE Type
110
 jobinfo_field_gluetype=GLUE Type
111
 jobinfo_field_executorparam=Param
111
 jobinfo_field_executorparam=Param
112
 jobinfo_field_cron_unvalid=The Cron is illegal
112
 jobinfo_field_cron_unvalid=The Cron is illegal
113
+jobinfo_field_cron_never_fire=The Cron will never fire
113
 jobinfo_field_author=Author
114
 jobinfo_field_author=Author
114
 jobinfo_field_alarmemail=Alarm email
115
 jobinfo_field_alarmemail=Alarm email
115
 jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated
116
 jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated

+ 2 - 1
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Visa fil

219
 		UPDATE xxl_job_info
219
 		UPDATE xxl_job_info
220
 		SET
220
 		SET
221
 			trigger_last_time = #{triggerLastTime},
221
 			trigger_last_time = #{triggerLastTime},
222
-			trigger_next_time = #{triggerNextTime}
222
+			trigger_next_time = #{triggerNextTime},
223
+			trigger_status = #{triggerStatus}
223
 		WHERE id = #{id}
224
 		WHERE id = #{id}
224
 	</update>
225
 	</update>
225
 
226