瀏覽代碼

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

xuxueli 6 年之前
父節點
當前提交
f4f05b6a53

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

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

+ 18 - 25
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java 查看文件

@@ -164,11 +164,10 @@ public final class XxlJobDynamicScheduler {
164 164
      */
165 165
 	public static void fillJobInfo(XxlJobInfo jobInfo) {
166 166
 
167
-        String group = String.valueOf(jobInfo.getJobGroup());
168 167
         String name = String.valueOf(jobInfo.getId());
169 168
 
170 169
         // trigger key
171
-        TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
170
+        TriggerKey triggerKey = TriggerKey.triggerKey(name);
172 171
         try {
173 172
 
174 173
             // trigger cron
@@ -198,15 +197,14 @@ public final class XxlJobDynamicScheduler {
198 197
      * add trigger + job
199 198
      *
200 199
      * @param jobName
201
-     * @param jobGroup
202 200
      * @param cronExpression
203 201
      * @return
204 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 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 209
         // 2、valid
212 210
         if (scheduler.checkExists(triggerKey)) {
@@ -239,16 +237,15 @@ public final class XxlJobDynamicScheduler {
239 237
      * remove trigger + job
240 238
      *
241 239
      * @param jobName
242
-     * @param jobGroup
243 240
      * @return
244 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 246
         scheduler.deleteJob(jobKey);
250 247
 
251
-        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
248
+        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
252 249
         if (scheduler.checkExists(triggerKey)) {
253 250
             scheduler.unscheduleJob(triggerKey);    // trigger + job
254 251
         }*/
@@ -261,16 +258,15 @@ public final class XxlJobDynamicScheduler {
261 258
     /**
262 259
      * updateJobCron
263 260
      *
264
-     * @param jobGroup
265 261
      * @param jobName
266 262
      * @param cronExpression
267 263
      * @return
268 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 268
         // 1、job key
273
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
269
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
274 270
 
275 271
         // 2、valid
276 272
         if (!scheduler.checkExists(triggerKey)) {
@@ -293,7 +289,7 @@ public final class XxlJobDynamicScheduler {
293 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 294
         // old job detail
299 295
         JobDetail jobDetail = scheduler.getJobDetail(jobKey);
@@ -304,7 +300,7 @@ public final class XxlJobDynamicScheduler {
304 300
         // cover trigger of job detail
305 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 304
         return true;
309 305
     }
310 306
 
@@ -313,13 +309,12 @@ public final class XxlJobDynamicScheduler {
313 309
      * pause
314 310
      *
315 311
      * @param jobName
316
-     * @param jobGroup
317 312
      * @return
318 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 319
         boolean result = false;
325 320
         if (scheduler.checkExists(triggerKey)) {
@@ -336,13 +331,12 @@ public final class XxlJobDynamicScheduler {
336 331
      * resume
337 332
      *
338 333
      * @param jobName
339
-     * @param jobGroup
340 334
      * @return
341 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 341
         boolean result = false;
348 342
         if (scheduler.checkExists(triggerKey)) {
@@ -359,14 +353,13 @@ public final class XxlJobDynamicScheduler {
359 353
      * run
360 354
      *
361 355
      * @param jobName
362
-     * @param jobGroup
363 356
      * @return
364 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 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 364
         boolean result = false;
372 365
         if (scheduler.checkExists(triggerKey)) {

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java 查看文件

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

+ 16 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java 查看文件

@@ -164,13 +164,19 @@ public class XxlJobServiceImpl implements XxlJobService {
164 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 173
 		// stage job info
168 174
 		XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
169 175
 		if (exists_jobInfo == null) {
170 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 180
 		exists_jobInfo.setJobCron(jobInfo.getJobCron());
175 181
 		exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
176 182
 		exists_jobInfo.setAuthor(jobInfo.getAuthor());
@@ -186,10 +192,9 @@ public class XxlJobServiceImpl implements XxlJobService {
186 192
 
187 193
 
188 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 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 198
         } catch (SchedulerException e) {
194 199
             logger.error(e.getMessage(), e);
195 200
 			return ReturnT.FAIL;
@@ -201,12 +206,14 @@ public class XxlJobServiceImpl implements XxlJobService {
201 206
 	@Override
202 207
 	public ReturnT<String> remove(int id) {
203 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 214
 		try {
208 215
 			// unbind quartz
209
-			XxlJobDynamicScheduler.removeJob(name, group);
216
+			XxlJobDynamicScheduler.removeJob(name);
210 217
 
211 218
 			xxlJobInfoDao.delete(id);
212 219
 			xxlJobLogDao.delete(id);
@@ -222,12 +229,11 @@ public class XxlJobServiceImpl implements XxlJobService {
222 229
 	@Override
223 230
 	public ReturnT<String> start(int id) {
224 231
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
225
-		String group = String.valueOf(xxlJobInfo.getJobGroup());
226 232
 		String name = String.valueOf(xxlJobInfo.getId());
227 233
 		String cronExpression = xxlJobInfo.getJobCron();
228 234
 
229 235
 		try {
230
-			boolean ret = XxlJobDynamicScheduler.addJob(name, group, cronExpression);
236
+			boolean ret = XxlJobDynamicScheduler.addJob(name, cronExpression);
231 237
 			return ret?ReturnT.SUCCESS:ReturnT.FAIL;
232 238
 		} catch (SchedulerException e) {
233 239
 			logger.error(e.getMessage(), e);
@@ -238,12 +244,11 @@ public class XxlJobServiceImpl implements XxlJobService {
238 244
 	@Override
239 245
 	public ReturnT<String> stop(int id) {
240 246
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
241
-        String group = String.valueOf(xxlJobInfo.getJobGroup());
242 247
         String name = String.valueOf(xxlJobInfo.getId());
243 248
 
244 249
 		try {
245 250
 			// bind quartz
246
-            boolean ret = XxlJobDynamicScheduler.removeJob(name, group);
251
+            boolean ret = XxlJobDynamicScheduler.removeJob(name);
247 252
             return ret?ReturnT.SUCCESS:ReturnT.FAIL;
248 253
 		} catch (SchedulerException e) {
249 254
 			logger.error(e.getMessage(), e);

+ 1 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml 查看文件

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

+ 2 - 2
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml 查看文件

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

+ 1 - 1
xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl 查看文件

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