xueli.xue 9 anni fa
parent
commit
c8b9403e83

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Vedi File

110
 		if (log == null) {
110
 		if (log == null) {
111
 			return new ReturnT<String>(500, "参数异常");
111
 			return new ReturnT<String>(500, "参数异常");
112
 		}
112
 		}
113
-		if (!ResponseModel.SUCCESS.equals(log.getTriggerStatus())) {
113
+		if (!(ResponseModel.SUCCESS.equals(log.getTriggerStatus()) || StringUtils.isNotBlank(log.getHandleStatus()))) {
114
 			return new ReturnT<String>(500, "调度失败,无法查看执行日志");
114
 			return new ReturnT<String>(500, "调度失败,无法查看执行日志");
115
 		}
115
 		}
116
 		
116
 		

+ 1 - 1
xxl-job-admin/src/main/resources/config.properties Vedi File

4
 mail.username=ovono802302@163.com
4
 mail.username=ovono802302@163.com
5
 mail.password=asdfzxcv
5
 mail.password=asdfzxcv
6
 mail.sendFrom=ovono802302@163.com
6
 mail.sendFrom=ovono802302@163.com
7
-mail.sendNick=《调度平台平台XXL-JOB》
7
+mail.sendNick=《调度调度平台XXL-JOB》
8
 
8
 
9
 # for login
9
 # for login
10
 login.username=admin
10
 login.username=admin

+ 1 - 1
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Vedi File

130
 	                	"render": function ( data, type, row ) {
130
 	                	"render": function ( data, type, row ) {
131
 	                		// better support expression or string, not function
131
 	                		// better support expression or string, not function
132
 	                		return function () {
132
 	                		return function () {
133
-		                		if (row.triggerStatus == 'SUCCESS'){
133
+		                		if (row.triggerStatus == 'SUCCESS' || row.handleStatus){
134
 		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">执行日志</a>';
134
 		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">执行日志</a>';
135
 		                			if(!row.handleStatus){
135
 		                			if(!row.handleStatus){
136
 		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'">终止任务</a>';
136
 		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'">终止任务</a>';

+ 4 - 4
xxl-job-core/src/main/java/com/xxl/job/core/router/HandlerRouter.java Vedi File

37
      */
37
      */
38
 	private static ConcurrentHashMap<String, JobThread> JobThreadRepository = new ConcurrentHashMap<String, JobThread>();
38
 	private static ConcurrentHashMap<String, JobThread> JobThreadRepository = new ConcurrentHashMap<String, JobThread>();
39
 	public static JobThread registJobThread(String jobkey, IJobHandler handler){
39
 	public static JobThread registJobThread(String jobkey, IJobHandler handler){
40
-		JobThread handlerThread = new JobThread(handler);
41
-		handlerThread.start();
42
-		logger.info(">>>>>>>>>>> xxl-job regist handler success, jobkey:{}, handler:{}", new Object[]{jobkey, handler});
43
-		return HandlerRouter.JobThreadRepository.put(jobkey, handlerThread);	// putIfAbsent
40
+		JobThread jobThread = new JobThread(handler);
41
+		jobThread.start();
42
+		logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobkey:{}, handler:{}", new Object[]{jobkey, handler});
43
+		return HandlerRouter.JobThreadRepository.put(jobkey, jobThread);	// putIfAbsent
44
 	}
44
 	}
45
 	public static JobThread loadJobThread(String jobKey){
45
 	public static JobThread loadJobThread(String jobKey){
46
 		return HandlerRouter.JobThreadRepository.get(jobKey);
46
 		return HandlerRouter.JobThreadRepository.get(jobKey);

+ 17 - 9
xxl-job-core/src/main/java/com/xxl/job/core/router/action/RunAction.java Vedi File

27
 
27
 
28
             // handler instance
28
             // handler instance
29
             IJobHandler jobHandler = HandlerRouter.loadJobHandler(requestModel.getExecutorHandler());
29
             IJobHandler jobHandler = HandlerRouter.loadJobHandler(requestModel.getExecutorHandler());
30
+            if (jobHandler==null) {
31
+                return new ResponseModel(ResponseModel.FAIL, "job handler for jobKey=[" + jobKey + "] not found.");
32
+            }
30
 
33
 
31
             if (jobThread == null) {
34
             if (jobThread == null) {
32
-                // jobhandler match
33
-                if (jobHandler==null) {
34
-                    return new ResponseModel(ResponseModel.FAIL, "job handler for jobKey=[" + jobKey + "] not found.");
35
-                }
36
                 jobThread = HandlerRouter.registJobThread(jobKey, jobHandler);
35
                 jobThread = HandlerRouter.registJobThread(jobKey, jobHandler);
37
             } else {
36
             } else {
38
-
39
                 // job handler update, kill old job thread
37
                 // job handler update, kill old job thread
40
                 if (jobThread.getHandler() != jobHandler) {
38
                 if (jobThread.getHandler() != jobHandler) {
41
-
42
                     // kill old job thread
39
                     // kill old job thread
43
-                    jobThread.toStop("人工手动终止");
40
+                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
44
                     jobThread.interrupt();
41
                     jobThread.interrupt();
45
 
42
 
46
                     // new thread, with new job handler
43
                     // new thread, with new job handler
49
             }
46
             }
50
         } else {
47
         } else {
51
             // glue model
48
             // glue model
52
-
53
             if (jobThread == null) {
49
             if (jobThread == null) {
54
                 jobThread = HandlerRouter.registJobThread(jobKey, new GlueJobHandler(requestModel.getJobGroup(), requestModel.getJobName()));
50
                 jobThread = HandlerRouter.registJobThread(jobKey, new GlueJobHandler(requestModel.getJobGroup(), requestModel.getJobName()));
51
+            } else {
52
+                // job handler update, kill old job thread
53
+                if (!(jobThread.getHandler() instanceof GlueJobHandler)) {
54
+                    // kill old job thread
55
+                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
56
+                    jobThread.interrupt();
57
+
58
+                    // new thread, with new job handler
59
+                    jobThread = HandlerRouter.registJobThread(jobKey, new GlueJobHandler(requestModel.getJobGroup(), requestModel.getJobName()));
60
+                }
55
             }
61
             }
56
         }
62
         }
57
 
63
 
58
         // sometime, cmap.get can not return given value, i do not know why
64
         // sometime, cmap.get can not return given value, i do not know why
59
-        jobThread = HandlerRouter.loadJobThread(jobKey);
65
+        if (jobThread == null) {
66
+            jobThread = HandlerRouter.loadJobThread(jobKey);
67
+        }
60
 
68
 
61
         // push data to queue
69
         // push data to queue
62
         jobThread.pushTriggerQueue(requestModel);
70
         jobThread.pushTriggerQueue(requestModel);

+ 5 - 9
xxl-job-core/src/main/java/com/xxl/job/core/router/thread/JobThread.java Vedi File

4
 import com.xxl.job.core.handler.IJobHandler.JobHandleStatus;
4
 import com.xxl.job.core.handler.IJobHandler.JobHandleStatus;
5
 import com.xxl.job.core.log.XxlJobFileAppender;
5
 import com.xxl.job.core.log.XxlJobFileAppender;
6
 import com.xxl.job.core.router.model.RequestModel;
6
 import com.xxl.job.core.router.model.RequestModel;
7
-import com.xxl.job.core.util.XxlJobNetCommUtil;
8
 import org.eclipse.jetty.util.ConcurrentHashSet;
7
 import org.eclipse.jetty.util.ConcurrentHashSet;
9
 import org.slf4j.Logger;
8
 import org.slf4j.Logger;
10
 import org.slf4j.LoggerFactory;
9
 import org.slf4j.LoggerFactory;
88
 						e.printStackTrace(new PrintWriter(out));
87
 						e.printStackTrace(new PrintWriter(out));
89
 						_msg = out.toString();
88
 						_msg = out.toString();
90
 					}
89
 					}
91
-					logger.info("----------- xxl-job job handle end ----------- <br>: ExecutorParams:{}, Status:{}, Msg:{}",
90
+					logger.info("----------- xxl-job job handle end ----------- <br> Look : ExecutorParams:{}, Status:{}, Msg:{}",
92
 							new Object[]{handlerParams, _status, _msg});
91
 							new Object[]{handlerParams, _status, _msg});
93
 					
92
 					
94
 					// callback handler info
93
 					// callback handler info
100
 					} else {
99
 					} else {
101
 						// is killed
100
 						// is killed
102
 						triggerDate.setStatus(JobHandleStatus.FAIL.name());
101
 						triggerDate.setStatus(JobHandleStatus.FAIL.name());
103
-						triggerDate.setMsg(stopReason + "人工手动终止[业务运行中,被强制终止]");
102
+						triggerDate.setMsg(stopReason + " [业务运行中,被强制终止]");
104
 						TriggerCallbackThread.pushCallBack(triggerDate);
103
 						TriggerCallbackThread.pushCallBack(triggerDate);
105
 					}
104
 					}
106
 				}
105
 				}
114
 			RequestModel triggerDate = triggerQueue.poll();
113
 			RequestModel triggerDate = triggerQueue.poll();
115
 			if (triggerDate!=null) {
114
 			if (triggerDate!=null) {
116
 				// is killed
115
 				// is killed
117
-				RequestModel callback = new RequestModel();
118
-				callback.setLogAddress(XxlJobNetCommUtil.addressToUrl(triggerDate.getLogAddress()));
119
-				callback.setLogId(triggerDate.getLogId());
120
-				callback.setStatus(JobHandleStatus.FAIL.name());
121
-				callback.setMsg(stopReason + "[任务尚未执行,在调度队列中被终止]");
122
-				TriggerCallbackThread.pushCallBack(callback);
116
+				triggerDate.setStatus(JobHandleStatus.FAIL.name());
117
+				triggerDate.setMsg(stopReason + " [任务尚未执行,在调度队列中被终止]");
118
+				TriggerCallbackThread.pushCallBack(triggerDate);
123
 			}
119
 			}
124
 		}
120
 		}
125
 		
121
 		

+ 1 - 0
xxl-job-core/src/main/java/com/xxl/job/core/router/thread/TriggerCallbackThread.java Vedi File

39
     }
39
     }
40
     public static void pushCallBack(RequestModel callback){
40
     public static void pushCallBack(RequestModel callback){
41
         callBackQueue.add(callback);
41
         callBackQueue.add(callback);
42
+        logger.debug(">>>>>>>>>>> xxl-job, push callback request, logId:{}", callback.getLogId());
42
     }
43
     }
43
 
44
 
44
 }
45
 }