Browse Source

任务支持更换绑定执行器,方便任务分组转移和管理;

xuxueli 6 years ago
parent
commit
32a843534c

+ 1 - 1
doc/XXL-JOB官方文档.md View File

1423
 - 9、任务暂停、删除优化,避免quartz delete不完整导致任务脏数据;
1423
 - 9、任务暂停、删除优化,避免quartz delete不完整导致任务脏数据;
1424
 - 10、任务回调、心跳注册成功日志优化,非核心常规日志调整为debug级别,降低冗余日志输出;
1424
 - 10、任务回调、心跳注册成功日志优化,非核心常规日志调整为debug级别,降低冗余日志输出;
1425
 - 11、执行器回调日志落盘方案复用RPC序列化方案,并移除Jackson依赖;
1425
 - 11、执行器回调日志落盘方案复用RPC序列化方案,并移除Jackson依赖;
1426
-- [迭代中]任务支持更换绑定执行器
1426
+- 12、任务支持更换绑定执行器,方便任务分组转移和管理
1427
 - [迭代中]注册中心优化,实时性注册发现:心跳注册间隔10s,refresh失败则首次注册并立即更新注册信息,心跳类似;30s过期销毁;
1427
 - [迭代中]注册中心优化,实时性注册发现:心跳注册间隔10s,refresh失败则首次注册并立即更新注册信息,心跳类似;30s过期销毁;
1428
 - [迭代中]脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
1428
 - [迭代中]脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
1429
 - [迭代中]提供执行器Docker镜像;
1429
 - [迭代中]提供执行器Docker镜像;

+ 18 - 25
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java View File

164
      */
164
      */
165
 	public static void fillJobInfo(XxlJobInfo jobInfo) {
165
 	public static void fillJobInfo(XxlJobInfo jobInfo) {
166
 
166
 
167
-        String group = String.valueOf(jobInfo.getJobGroup());
168
         String name = String.valueOf(jobInfo.getId());
167
         String name = String.valueOf(jobInfo.getId());
169
 
168
 
170
         // trigger key
169
         // trigger key
171
-        TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
170
+        TriggerKey triggerKey = TriggerKey.triggerKey(name);
172
         try {
171
         try {
173
 
172
 
174
             // trigger cron
173
             // trigger cron
198
      * add trigger + job
197
      * add trigger + job
199
      *
198
      *
200
      * @param jobName
199
      * @param jobName
201
-     * @param jobGroup
202
      * @param cronExpression
200
      * @param cronExpression
203
      * @return
201
      * @return
204
      * @throws SchedulerException
202
      * @throws SchedulerException
205
      */
203
      */
206
-	public static boolean addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException {
204
+	public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
207
     	// 1、job key
205
     	// 1、job key
208
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
209
-        JobKey jobKey = new JobKey(jobName, jobGroup);
206
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
207
+        JobKey jobKey = new JobKey(jobName);
210
 
208
 
211
         // 2、valid
209
         // 2、valid
212
         if (scheduler.checkExists(triggerKey)) {
210
         if (scheduler.checkExists(triggerKey)) {
239
      * remove trigger + job
237
      * remove trigger + job
240
      *
238
      *
241
      * @param jobName
239
      * @param jobName
242
-     * @param jobGroup
243
      * @return
240
      * @return
244
      * @throws SchedulerException
241
      * @throws SchedulerException
245
      */
242
      */
246
-    public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException {
243
+    public static boolean removeJob(String jobName) throws SchedulerException {
247
 
244
 
248
-        JobKey jobKey = new JobKey(jobName, jobGroup);
245
+        JobKey jobKey = new JobKey(jobName);
249
         scheduler.deleteJob(jobKey);
246
         scheduler.deleteJob(jobKey);
250
 
247
 
251
-        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
248
+        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
252
         if (scheduler.checkExists(triggerKey)) {
249
         if (scheduler.checkExists(triggerKey)) {
253
             scheduler.unscheduleJob(triggerKey);    // trigger + job
250
             scheduler.unscheduleJob(triggerKey);    // trigger + job
254
         }*/
251
         }*/
261
     /**
258
     /**
262
      * updateJobCron
259
      * updateJobCron
263
      *
260
      *
264
-     * @param jobGroup
265
      * @param jobName
261
      * @param jobName
266
      * @param cronExpression
262
      * @param cronExpression
267
      * @return
263
      * @return
268
      * @throws SchedulerException
264
      * @throws SchedulerException
269
      */
265
      */
270
-	public static boolean updateJobCron(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
266
+	public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
271
 
267
 
272
         // 1、job key
268
         // 1、job key
273
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
269
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
274
 
270
 
275
         // 2、valid
271
         // 2、valid
276
         if (!scheduler.checkExists(triggerKey)) {
272
         if (!scheduler.checkExists(triggerKey)) {
293
         scheduler.rescheduleJob(triggerKey, oldTrigger);
289
         scheduler.rescheduleJob(triggerKey, oldTrigger);
294
 
290
 
295
         /*
291
         /*
296
-        JobKey jobKey = new JobKey(jobName, jobGroup);
292
+        JobKey jobKey = new JobKey(jobName);
297
 
293
 
298
         // old job detail
294
         // old job detail
299
         JobDetail jobDetail = scheduler.getJobDetail(jobKey);
295
         JobDetail jobDetail = scheduler.getJobDetail(jobKey);
304
         // cover trigger of job detail
300
         // cover trigger of job detail
305
         scheduler.scheduleJob(jobDetail, triggerSet, true);*/
301
         scheduler.scheduleJob(jobDetail, triggerSet, true);*/
306
 
302
 
307
-        logger.info(">>>>>>>>>>> resumeJob success, JobGroup:{}, JobName:{}", jobGroup, jobName);
303
+        logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
308
         return true;
304
         return true;
309
     }
305
     }
310
 
306
 
313
      * pause
309
      * pause
314
      *
310
      *
315
      * @param jobName
311
      * @param jobName
316
-     * @param jobGroup
317
      * @return
312
      * @return
318
      * @throws SchedulerException
313
      * @throws SchedulerException
319
      */
314
      */
320
-    /*public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException {
315
+    /*public static boolean pauseJob(String jobName) throws SchedulerException {
321
 
316
 
322
-    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
317
+    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
323
 
318
 
324
         boolean result = false;
319
         boolean result = false;
325
         if (scheduler.checkExists(triggerKey)) {
320
         if (scheduler.checkExists(triggerKey)) {
336
      * resume
331
      * resume
337
      *
332
      *
338
      * @param jobName
333
      * @param jobName
339
-     * @param jobGroup
340
      * @return
334
      * @return
341
      * @throws SchedulerException
335
      * @throws SchedulerException
342
      */
336
      */
343
-    /*public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException {
337
+    /*public static boolean resumeJob(String jobName) throws SchedulerException {
344
 
338
 
345
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
339
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
346
         
340
         
347
         boolean result = false;
341
         boolean result = false;
348
         if (scheduler.checkExists(triggerKey)) {
342
         if (scheduler.checkExists(triggerKey)) {
359
      * run
353
      * run
360
      *
354
      *
361
      * @param jobName
355
      * @param jobName
362
-     * @param jobGroup
363
      * @return
356
      * @return
364
      * @throws SchedulerException
357
      * @throws SchedulerException
365
      */
358
      */
366
-    /*public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException {
359
+    /*public static boolean triggerJob(String jobName) throws SchedulerException {
367
     	// TriggerKey : name + group
360
     	// TriggerKey : name + group
368
-    	JobKey jobKey = new JobKey(jobName, jobGroup);
369
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
361
+    	JobKey jobKey = new JobKey(jobName);
362
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
370
 
363
 
371
         boolean result = false;
364
         boolean result = false;
372
         if (scheduler.checkExists(triggerKey)) {
365
         if (scheduler.checkExists(triggerKey)) {

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java View File

14
  */
14
  */
15
 @Mapper
15
 @Mapper
16
 public interface XxlJobLogDao {
16
 public interface XxlJobLogDao {
17
-	
17
+
18
+	// exist jobId not use jobGroup, not exist use jobGroup
18
 	public List<XxlJobLog> pageList(@Param("offset") int offset,
19
 	public List<XxlJobLog> pageList(@Param("offset") int offset,
19
 									@Param("pagesize") int pagesize,
20
 									@Param("pagesize") int pagesize,
20
 									@Param("jobGroup") int jobGroup,
21
 									@Param("jobGroup") int jobGroup,

+ 16 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java View File

164
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
164
 			jobInfo.setChildJobId(StringUtils.join(childJobIds, ","));
165
 		}
165
 		}
166
 
166
 
167
+		// group valid
168
+		XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup());
169
+		if (jobGroup == null) {
170
+			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup")+I18nUtil.getString("system_unvalid")) );
171
+		}
172
+
167
 		// stage job info
173
 		// stage job info
168
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
174
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
169
 		if (exists_jobInfo == null) {
175
 		if (exists_jobInfo == null) {
170
 			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) );
176
 			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) );
171
 		}
177
 		}
172
-		//String old_cron = exists_jobInfo.getJobCron();
173
 
178
 
179
+		exists_jobInfo.setJobGroup(jobInfo.getJobGroup());
174
 		exists_jobInfo.setJobCron(jobInfo.getJobCron());
180
 		exists_jobInfo.setJobCron(jobInfo.getJobCron());
175
 		exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
181
 		exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
176
 		exists_jobInfo.setAuthor(jobInfo.getAuthor());
182
 		exists_jobInfo.setAuthor(jobInfo.getAuthor());
186
 
192
 
187
 
193
 
188
 		// update quartz-cron if started
194
 		// update quartz-cron if started
189
-		String qz_group = String.valueOf(exists_jobInfo.getJobGroup());
190
-		String qz_name = String.valueOf(exists_jobInfo.getId());
191
         try {
195
         try {
192
-            XxlJobDynamicScheduler.updateJobCron(qz_group, qz_name, exists_jobInfo.getJobCron());
196
+			String qz_name = String.valueOf(exists_jobInfo.getId());
197
+            XxlJobDynamicScheduler.updateJobCron(qz_name, exists_jobInfo.getJobCron());
193
         } catch (SchedulerException e) {
198
         } catch (SchedulerException e) {
194
             logger.error(e.getMessage(), e);
199
             logger.error(e.getMessage(), e);
195
 			return ReturnT.FAIL;
200
 			return ReturnT.FAIL;
201
 	@Override
206
 	@Override
202
 	public ReturnT<String> remove(int id) {
207
 	public ReturnT<String> remove(int id) {
203
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
208
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
204
-        String group = String.valueOf(xxlJobInfo.getJobGroup());
205
-        String name = String.valueOf(xxlJobInfo.getId());
209
+		if (xxlJobInfo == null) {
210
+			return ReturnT.SUCCESS;
211
+		}
212
+		String name = String.valueOf(xxlJobInfo.getId());
206
 
213
 
207
 		try {
214
 		try {
208
 			// unbind quartz
215
 			// unbind quartz
209
-			XxlJobDynamicScheduler.removeJob(name, group);
216
+			XxlJobDynamicScheduler.removeJob(name);
210
 
217
 
211
 			xxlJobInfoDao.delete(id);
218
 			xxlJobInfoDao.delete(id);
212
 			xxlJobLogDao.delete(id);
219
 			xxlJobLogDao.delete(id);
222
 	@Override
229
 	@Override
223
 	public ReturnT<String> start(int id) {
230
 	public ReturnT<String> start(int id) {
224
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
231
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
225
-		String group = String.valueOf(xxlJobInfo.getJobGroup());
226
 		String name = String.valueOf(xxlJobInfo.getId());
232
 		String name = String.valueOf(xxlJobInfo.getId());
227
 		String cronExpression = xxlJobInfo.getJobCron();
233
 		String cronExpression = xxlJobInfo.getJobCron();
228
 
234
 
229
 		try {
235
 		try {
230
-			boolean ret = XxlJobDynamicScheduler.addJob(name, group, cronExpression);
236
+			boolean ret = XxlJobDynamicScheduler.addJob(name, cronExpression);
231
 			return ret?ReturnT.SUCCESS:ReturnT.FAIL;
237
 			return ret?ReturnT.SUCCESS:ReturnT.FAIL;
232
 		} catch (SchedulerException e) {
238
 		} catch (SchedulerException e) {
233
 			logger.error(e.getMessage(), e);
239
 			logger.error(e.getMessage(), e);
238
 	@Override
244
 	@Override
239
 	public ReturnT<String> stop(int id) {
245
 	public ReturnT<String> stop(int id) {
240
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
246
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
241
-        String group = String.valueOf(xxlJobInfo.getJobGroup());
242
         String name = String.valueOf(xxlJobInfo.getId());
247
         String name = String.valueOf(xxlJobInfo.getId());
243
 
248
 
244
 		try {
249
 		try {
245
 			// bind quartz
250
 			// bind quartz
246
-            boolean ret = XxlJobDynamicScheduler.removeJob(name, group);
251
+            boolean ret = XxlJobDynamicScheduler.removeJob(name);
247
             return ret?ReturnT.SUCCESS:ReturnT.FAIL;
252
             return ret?ReturnT.SUCCESS:ReturnT.FAIL;
248
 		} catch (SchedulerException e) {
253
 		} catch (SchedulerException e) {
249
 			logger.error(e.getMessage(), e);
254
 			logger.error(e.getMessage(), e);

+ 1 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml View File

142
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" >
142
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" >
143
 		UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
143
 		UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
144
 		SET
144
 		SET
145
+			job_group = #{jobGroup},
145
 			job_cron = #{jobCron},
146
 			job_cron = #{jobCron},
146
 			job_desc = #{jobDesc},
147
 			job_desc = #{jobDesc},
147
 			update_time = NOW(),
148
 			update_time = NOW(),

+ 2 - 2
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml View File

48
 		SELECT <include refid="Base_Column_List" />
48
 		SELECT <include refid="Base_Column_List" />
49
 		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
49
 		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
50
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
50
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
51
-			<if test="jobGroup gt 0">
51
+			<if test="jobId==0 and jobGroup gt 0">
52
 				AND t.job_group = #{jobGroup}
52
 				AND t.job_group = #{jobGroup}
53
 			</if>
53
 			</if>
54
 			<if test="jobId gt 0">
54
 			<if test="jobId gt 0">
82
 		SELECT count(1)
82
 		SELECT count(1)
83
 		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
83
 		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
84
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
84
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
85
-			<if test="jobGroup gt 0">
85
+			<if test="jobId==0 and jobGroup gt 0">
86
 				AND t.job_group = #{jobGroup}
86
 				AND t.job_group = #{jobGroup}
87
 			</if>
87
 			</if>
88
 			<if test="jobId gt 0">
88
 			<if test="jobId gt 0">

+ 1 - 1
xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl View File

301
 					<div class="form-group">
301
 					<div class="form-group">
302
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_jobgroup}<font color="red">*</font></label>
302
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_jobgroup}<font color="red">*</font></label>
303
                         <div class="col-sm-4">
303
                         <div class="col-sm-4">
304
-                            <select class="form-control" name="jobGroup" disabled >
304
+                            <select class="form-control" name="jobGroup" >
305
 							<#list JobGroupList as group>
305
 							<#list JobGroupList as group>
306
                                 <option value="${group.id}" >${group.title}</option>
306
                                 <option value="${group.id}" >${group.title}</option>
307
 							</#list>
307
 							</#list>