Browse Source

调度全异步处理:任务触发之后,推送到调度队列,多线程并发处理调度请求,提高任务调度速率的同时,避免因网络问题导致quartz调度线程阻塞的问题;

xuxueli 7 years ago
parent
commit
04abd88475

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

1236
 - 17、自研Log组件参数占位符改为"{}",并修复打印有参日志时参数不匹配导致报错的问题;
1236
 - 17、自研Log组件参数占位符改为"{}",并修复打印有参日志时参数不匹配导致报错的问题;
1237
 - 18、核心依赖Core内部国际化处理;
1237
 - 18、核心依赖Core内部国际化处理;
1238
 - 19、默认Quartz线程数调整为50;
1238
 - 19、默认Quartz线程数调整为50;
1239
+- 20、调度全异步处理:任务触发之后,推送到调度队列,多线程并发处理调度请求,提高任务调度速率的同时,避免因网络问题导致quartz调度线程阻塞的问题;
1239
 
1240
 
1240
 
1241
 
1241
 ### TODO LIST
1242
 ### TODO LIST

+ 3 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java View File

1
 package com.xxl.job.admin.core.jobbean;
1
 package com.xxl.job.admin.core.jobbean;
2
 
2
 
3
-import com.xxl.job.admin.core.trigger.XxlJobTrigger;
3
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
4
 import org.quartz.JobExecutionContext;
4
 import org.quartz.JobExecutionContext;
5
 import org.quartz.JobExecutionException;
5
 import org.quartz.JobExecutionException;
6
 import org.quartz.JobKey;
6
 import org.quartz.JobKey;
26
 		Integer jobId = Integer.valueOf(jobKey.getName());
26
 		Integer jobId = Integer.valueOf(jobKey.getName());
27
 
27
 
28
 		// trigger
28
 		// trigger
29
-		XxlJobTrigger.trigger(jobId);
29
+		//XxlJobTrigger.trigger(jobId);
30
+		JobTriggerPoolHelper.trigger(jobId);
30
 	}
31
 	}
31
 
32
 
32
 }
33
 }

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

4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
5
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
6
 import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
6
 import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
7
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
7
 import com.xxl.job.admin.core.util.I18nUtil;
8
 import com.xxl.job.admin.core.util.I18nUtil;
8
 import com.xxl.job.admin.dao.XxlJobGroupDao;
9
 import com.xxl.job.admin.dao.XxlJobGroupDao;
9
 import com.xxl.job.admin.dao.XxlJobInfoDao;
10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
93
     }
94
     }
94
 
95
 
95
     public void destroy(){
96
     public void destroy(){
97
+
98
+        // admin trigger pool stop
99
+        JobTriggerPoolHelper.toStop();
100
+
96
         // admin registry stop
101
         // admin registry stop
97
         JobRegistryMonitorHelper.getInstance().toStop();
102
         JobRegistryMonitorHelper.getInstance().toStop();
98
 
103
 

+ 59 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java View File

1
+package com.xxl.job.admin.core.thread;
2
+
3
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4
+import org.slf4j.Logger;
5
+import org.slf4j.LoggerFactory;
6
+
7
+import java.util.concurrent.LinkedBlockingQueue;
8
+import java.util.concurrent.ThreadPoolExecutor;
9
+import java.util.concurrent.TimeUnit;
10
+
11
+/**
12
+ * job trigger thread pool helper
13
+ *
14
+ * @author xuxueli 2018-07-03 21:08:07
15
+ */
16
+public class JobTriggerPoolHelper {
17
+    private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
18
+
19
+
20
+    // ---------------------- trigger pool ----------------------
21
+
22
+    private ThreadPoolExecutor triggerPool = new ThreadPoolExecutor(
23
+            50,
24
+            500,
25
+            60L,
26
+            TimeUnit.SECONDS,
27
+            new LinkedBlockingQueue<Runnable>(100000),
28
+            new ThreadPoolExecutor.CallerRunsPolicy());
29
+
30
+
31
+    public void addTrigger(final int jobId){
32
+        triggerPool.execute(new Runnable() {
33
+            @Override
34
+            public void run() {
35
+                XxlJobTrigger.trigger(jobId);
36
+            }
37
+        });
38
+    }
39
+
40
+    public void stop(){
41
+        //triggerPool.shutdown();
42
+        triggerPool.shutdownNow();
43
+        logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
44
+    }
45
+
46
+    // ---------------------- helper ----------------------
47
+
48
+    private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
49
+
50
+
51
+    public static void trigger(int jobId) {
52
+        helper.addTrigger(jobId);
53
+    }
54
+
55
+    public static void toStop(){
56
+        helper.stop();
57
+    }
58
+
59
+}

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

5
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
8
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
8
 import com.xxl.job.admin.core.util.I18nUtil;
9
 import com.xxl.job.admin.core.util.I18nUtil;
9
 import com.xxl.job.admin.dao.XxlJobGroupDao;
10
 import com.xxl.job.admin.dao.XxlJobGroupDao;
10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
11
 import com.xxl.job.admin.dao.XxlJobInfoDao;
275
 
276
 
276
 	@Override
277
 	@Override
277
 	public ReturnT<String> triggerJob(int id) {
278
 	public ReturnT<String> triggerJob(int id) {
278
-        XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
279
+
280
+		JobTriggerPoolHelper.trigger(id);
281
+		return ReturnT.SUCCESS;
282
+
283
+        /*XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
279
         if (xxlJobInfo == null) {
284
         if (xxlJobInfo == null) {
280
         	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
285
         	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
281
 		}
286
 		}
289
 		} catch (SchedulerException e) {
294
 		} catch (SchedulerException e) {
290
 			logger.error(e.getMessage(), e);
295
 			logger.error(e.getMessage(), e);
291
 			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
296
 			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
292
-		}
297
+		}*/
298
+
293
 	}
299
 	}
294
 
300
 
295
 	@Override
301
 	@Override