Parcourir la source

功能完善:

xueli.xue il y a 9 ans
Parent
révision
168050dcda

+ 8 - 0
README.md Voir le fichier

@@ -71,6 +71,13 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job
71 71
 	2、执行器异步回调执行日志;
72 72
 	3、【重要】在 “调度中心” 支持HA的基础上,扩展执行器的Failover支持,支持配置多执行期地址;
73 73
 
74
+# 规划中
75
+	1、任务终止时,任务队列中调度回调通过被终止的接口;
76
+	2、任务执行规则自定义:假如前一个任务正在执行,后续调度执行规则支持自定义;
77
+		串行(默认,当前逻辑):后续调度入调度队列;
78
+		并行:后续调度并行执行;
79
+		Pass:后续调度被Pass;
80
+
74 81
 # 源码目录说明
75 82
 	/xxl-job-admin					【调度中心】:负责管理调度信息,按照调度配置发出调度请求;
76 83
 	/xxl-job-core					公共依赖
@@ -87,3 +94,4 @@ git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job
87 94
 	4、人人聚财金服;
88 95
 	5、……
89 96
 	更多接入公司,欢迎在https://github.com/xuxueli/xxl-job/issues/1 登记。
97
+	

+ 12 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java Voir le fichier

@@ -22,6 +22,7 @@ public class XxlJobLogCallbackServer {
22 22
 		return trigger_log_address;
23 23
 	}
24 24
     
25
+    Server server = null;
25 26
     public void start(int callBackPort) throws Exception {
26 27
     	// init address
27 28
     	
@@ -32,7 +33,7 @@ public class XxlJobLogCallbackServer {
32 33
         new Thread(new Runnable() {
33 34
             @Override
34 35
             public void run() {
35
-                Server server = new Server();
36
+                server = new Server();
36 37
                 server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
37 38
 
38 39
                 // connector
@@ -59,4 +60,14 @@ public class XxlJobLogCallbackServer {
59 60
 
60 61
     }
61 62
 
63
+	public void destroy() {
64
+		if (server!=null) {
65
+			try {
66
+				server.stop();
67
+			} catch (Exception e) {
68
+				e.printStackTrace();
69
+			}
70
+		}
71
+	}
72
+
62 73
 }

+ 10 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/DynamicSchedulerUtil.java Voir le fichier

@@ -55,15 +55,24 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
55 55
 	}
56 56
     
57 57
     // init
58
+    XxlJobLogCallbackServer xxlJobLogCallbackServer = null;
58 59
     public void init(){
59 60
     	try {
60 61
     		// start callback server
61
-			new XxlJobLogCallbackServer().start(callBackPort);
62
+    		xxlJobLogCallbackServer = new XxlJobLogCallbackServer();
63
+    		xxlJobLogCallbackServer.start(callBackPort);
62 64
 		} catch (Exception e) {
63 65
 			e.printStackTrace();
64 66
 		}
65 67
     }
66 68
     
69
+    // destroy
70
+    public void destroy(){
71
+    	if (xxlJobLogCallbackServer!=null) {
72
+    		xxlJobLogCallbackServer.destroy();
73
+		}
74
+    }
75
+    
67 76
     // xxlJobLogDao、xxlJobInfoDao
68 77
     public static IXxlJobLogDao xxlJobLogDao;
69 78
     public static IXxlJobInfoDao xxlJobInfoDao;

+ 1 - 1
xxl-job-admin/src/main/resources/applicationcontext-xxl-job.xml Voir le fichier

@@ -18,7 +18,7 @@
18 18
 	</bean>
19 19
 	
20 20
 	<!-- 协同-调度器 -->
21
-	<bean id="dynamicSchedulerUtil" class="com.xxl.job.admin.core.util.DynamicSchedulerUtil" init-method="init">
21
+	<bean id="dynamicSchedulerUtil" class="com.xxl.job.admin.core.util.DynamicSchedulerUtil" init-method="init" destroy-method="destroy" >
22 22
 		<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
23 23
         <property name="scheduler" ref="quartzScheduler"/>
24 24
         <property name="callBackPort" value="8888"/>

+ 14 - 1
xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java Voir le fichier

@@ -29,12 +29,14 @@ public class XxlJobExecutor implements ApplicationContextAware {
29 29
         this.port = port;
30 30
     }
31 31
 
32
+    // ---------------------------------- job server ------------------------------------
33
+    Server server = null;
32 34
     public void start() throws Exception {
33 35
 
34 36
         new Thread(new Runnable() {
35 37
             @Override
36 38
             public void run() {
37
-                Server server = new Server();
39
+                server = new Server();
38 40
                 server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
39 41
 
40 42
                 // connector
@@ -60,7 +62,18 @@ public class XxlJobExecutor implements ApplicationContextAware {
60 62
         }).start();
61 63
 
62 64
     }
65
+    
66
+    public void destroy(){
67
+    	if (server!=null) {
68
+    		try {
69
+				server.stop();
70
+			} catch (Exception e) {
71
+				e.printStackTrace();
72
+			}
73
+		}
74
+    }
63 75
 
76
+    // ---------------------------------- init job handler ------------------------------------
64 77
     public static ApplicationContext applicationContext;
65 78
 	@Override
66 79
 	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

+ 22 - 0
xxl-job-core/src/main/java/com/xxl/job/core/handler/HandlerThread.java Voir le fichier

@@ -96,6 +96,12 @@ public class HandlerThread extends Thread{
96 96
 						params.put("status", _status.name());
97 97
 						params.put("msg", _msg);
98 98
 						HandlerRepository.pushCallBack(HttpUtil.addressToUrl(log_address), params);
99
+					} else {
100
+						HashMap<String, String> params = new HashMap<String, String>();
101
+						params.put("log_id", log_id);
102
+						params.put("status", JobHandleStatus.FAIL.name());
103
+						params.put("msg", "人工手动终止[业务运行中,被强制终止]");
104
+						HandlerRepository.pushCallBack(HttpUtil.addressToUrl(log_address), params);
99 105
 					}
100 106
 				} else {
101 107
 					i++;
@@ -113,6 +119,22 @@ public class HandlerThread extends Thread{
113 119
 				logger.info("HandlerThread Exception:", e);
114 120
 			}
115 121
 		}
122
+		
123
+		// callback trigger request in queue
124
+		while(handlerDataQueue!=null && handlerDataQueue.size()>0){
125
+			Map<String, String> handlerData = handlerDataQueue.poll();
126
+			if (handlerData!=null) {
127
+				String log_address = handlerData.get(HandlerParamEnum.LOG_ADDRESS.name());
128
+				String log_id = handlerData.get(HandlerParamEnum.LOG_ID.name());
129
+				
130
+				HashMap<String, String> params = new HashMap<String, String>();
131
+				params.put("log_id", log_id);
132
+				params.put("status", JobHandleStatus.FAIL.name());
133
+				params.put("msg", "人工手动终止[任务尚未执行,在调度队列中被终止]");
134
+				HandlerRepository.pushCallBack(HttpUtil.addressToUrl(log_address), params);
135
+			}
136
+		}
137
+		
116 138
 		logger.info(">>>>>>>>>>>> xxl-job handlerThrad stoped, hashCode:{}", Thread.currentThread());
117 139
 	}
118 140
 }

+ 1 - 1
xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml Voir le fichier

@@ -12,7 +12,7 @@
12 12
 	<context:component-scan base-package="com.xxl.job.executor" />
13 13
 
14 14
 	<!-- 执行器 -->
15
-	<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.jetty.XxlJobExecutor" init-method="start">
15
+	<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.jetty.XxlJobExecutor" init-method="start" destroy-method="destroy" >
16 16
 		<property name="port" value="9999" />
17 17
 	</bean>
18 18