瀏覽代碼

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

xuxueli 6 年之前
父節點
當前提交
5b280137fb

+ 1 - 0
doc/XXL-JOB官方文档.md 查看文件

@@ -1519,6 +1519,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1519 1519
 - 8、[ING]任务、执行器数据全量本地缓存;新增消息表广播通知;
1520 1520
 - 9、[ING]任务触发组件优化,常规1s预加载一次,轮空时主动休眠4s;
1521 1521
 - 10、注册监控线程优化,降低死锁几率;
1522
+- 11、调度组件优化:针对永远不会触发的Cron禁止配置和启动;任务Cron最后一次触发后再也不会触发时,比如一次性任务,主动停止相关任务;
1522 1523
 
1523 1524
 
1524 1525
 ### TODO LIST

+ 27 - 18
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java 查看文件

@@ -78,12 +78,15 @@ public class JobScheduleHelper {
78 78
                                     // 过期超5s:本地忽略,当前时间开始计算下次触发时间
79 79
 
80 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 91
                                 } else if (nowTime > jobInfo.getTriggerNextTime()) {
89 92
                                     // 过期5s内 :立即触发一次,当前时间开始计算下次触发时间;
@@ -110,12 +113,15 @@ public class JobScheduleHelper {
110 113
                                         pushTimeRing(ringSecond, jobInfo.getId());
111 114
 
112 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,12 +135,15 @@ public class JobScheduleHelper {
129 135
                                     pushTimeRing(ringSecond, jobInfo.getId());
130 136
 
131 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 查看文件

@@ -194,7 +194,11 @@ public class XxlJobServiceImpl implements XxlJobService {
194 194
 		long nextTriggerTime = exists_jobInfo.getTriggerNextTime();
195 195
 		if (exists_jobInfo.getTriggerStatus() == 1 && !jobInfo.getJobCron().equals(exists_jobInfo.getJobCron()) ) {
196 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 202
 			} catch (ParseException e) {
199 203
 				logger.error(e.getMessage(), e);
200 204
 				return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
@@ -240,7 +244,11 @@ public class XxlJobServiceImpl implements XxlJobService {
240 244
 		// next trigger time (5s后生效,避开预读周期)
241 245
 		long nextTriggerTime = 0;
242 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 252
 		} catch (ParseException e) {
245 253
 			logger.error(e.getMessage(), e);
246 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 查看文件

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

+ 1 - 0
xxl-job-admin/src/main/resources/i18n/message_en.properties 查看文件

@@ -110,6 +110,7 @@ jobinfo_field_timeout=Job timeout period
110 110
 jobinfo_field_gluetype=GLUE Type
111 111
 jobinfo_field_executorparam=Param
112 112
 jobinfo_field_cron_unvalid=The Cron is illegal
113
+jobinfo_field_cron_never_fire=The Cron will never fire
113 114
 jobinfo_field_author=Author
114 115
 jobinfo_field_alarmemail=Alarm email
115 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 查看文件

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