xueli.xue 8 years ago
parent
commit
b8e196606d

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java View File

149
 		ReturnT<String> runResult = executorBiz.kill(String.valueOf(log.getJobGroup()), log.getJobName());
149
 		ReturnT<String> runResult = executorBiz.kill(String.valueOf(log.getJobGroup()), log.getJobName());
150
 
150
 
151
 		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
151
 		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
152
-			log.setHandleCode(ReturnT.SUCCESS_CODE);
153
-			log.setHandleMsg("人为操作主动终止");
152
+			log.setHandleCode(ReturnT.FAIL_CODE);
153
+			log.setHandleMsg("人为操作主动终止:" + (runResult.getMsg()!=null?runResult.getMsg():""));
154
 			log.setHandleTime(new Date());
154
 			log.setHandleTime(new Date());
155
 			xxlJobLogDao.updateHandleInfo(log);
155
 			xxlJobLogDao.updateHandleInfo(log);
156
 			return new ReturnT<String>(runResult.getMsg());
156
 			return new ReturnT<String>(runResult.getMsg());

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

74
 		}
74
 		}
75
 
75
 
76
 		// failover trigger
76
 		// failover trigger
77
-		ReturnT<String> responseModel = failoverTrigger(addressList, triggerParam, jobLog);
77
+		ReturnT<String> triggerResult = failoverTrigger(addressList, triggerParam, jobLog);
78
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
78
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
79
 		jobLog.setExecutorParam(jobInfo.getExecutorParam());
79
 		jobLog.setExecutorParam(jobInfo.getExecutorParam());
80
-		logger.info(">>>>>>>>>>> xxl-job failoverTrigger response, jobId:{}, responseModel:{}", jobLog.getId(), responseModel.toString());
80
+		logger.info(">>>>>>>>>>> xxl-job failoverTrigger, jobId:{}, triggerResult:{}", jobLog.getId(), triggerResult.toString());
81
 		
81
 		
82
 		// update trigger info 2/2
82
 		// update trigger info 2/2
83
-		jobLog.setTriggerCode(responseModel.getCode());
84
-		jobLog.setTriggerMsg(responseModel.getMsg());
83
+		jobLog.setTriggerCode(triggerResult.getCode());
84
+		jobLog.setTriggerMsg(triggerResult.getMsg());
85
 		XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog);
85
 		XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog);
86
 
86
 
87
 		// monitor triger
87
 		// monitor triger

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

2
 
2
 
3
 import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
3
 import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
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.JobMonitorHelper;
5
 import com.xxl.job.admin.core.thread.JobRegistryHelper;
6
 import com.xxl.job.admin.core.thread.JobRegistryHelper;
6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
8
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
67
             callbackAddress = IpUtil.getIpPort(callBackPort);;
68
             callbackAddress = IpUtil.getIpPort(callBackPort);;
68
         }
69
         }
69
 
70
 
70
-		// init JobRegistryHelper
71
-        JobRegistryHelper.discover("g", "k");
71
+		// admin registry run
72
+        JobRegistryHelper.getInstance().start();
73
+
74
+        // admin monitor run
75
+        JobMonitorHelper.getInstance().start();
72
     }
76
     }
73
     
77
     
74
     // destroy
78
     // destroy
75
     public void destroy(){
79
     public void destroy(){
80
+        // admin registry stop
81
+        JobRegistryHelper.getInstance().stop();
82
+
83
+        // admin monitor stop
84
+        JobMonitorHelper.getInstance().stop();
85
+
76
         serverFactory.destroy();
86
         serverFactory.destroy();
77
     }
87
     }
78
     
88
     

+ 22 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobMonitorHelper.java View File

16
 import java.util.concurrent.*;
16
 import java.util.concurrent.*;
17
 
17
 
18
 /**
18
 /**
19
- * job monitor helper
19
+ * job monitor instance
20
  * @author xuxueli 2015-9-1 18:05:56
20
  * @author xuxueli 2015-9-1 18:05:56
21
  */
21
  */
22
 public class JobMonitorHelper {
22
 public class JobMonitorHelper {
23
 	private static Logger logger = LoggerFactory.getLogger(JobMonitorHelper.class);
23
 	private static Logger logger = LoggerFactory.getLogger(JobMonitorHelper.class);
24
 	
24
 	
25
-	private static JobMonitorHelper helper = new JobMonitorHelper();
26
-	private ExecutorService executor = Executors.newCachedThreadPool();
25
+	private static JobMonitorHelper instance = new JobMonitorHelper();
26
+	public static JobMonitorHelper getInstance(){
27
+		return instance;
28
+	}
29
+
27
 	private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
30
 	private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
28
-	private ConcurrentHashMap<String, Integer> countMap = new ConcurrentHashMap<String, Integer>();
29
-	
30
-	public JobMonitorHelper(){
31
-		// consumer
32
-		executor.execute(new Runnable() {
31
+
32
+	private Thread monitorThread;
33
+	private boolean toStop = false;
34
+	public void start(){
35
+		monitorThread = new Thread(new Runnable() {
36
+
33
 			@Override
37
 			@Override
34
 			public void run() {
38
 			public void run() {
35
 				while (true) {
39
 				while (true) {
36
 					try {
40
 					try {
37
 						logger.debug(">>>>>>>>>>> job monitor beat ... ");
41
 						logger.debug(">>>>>>>>>>> job monitor beat ... ");
38
-						Integer jobLogId = JobMonitorHelper.helper.queue.take();
42
+						Integer jobLogId = JobMonitorHelper.instance.queue.take();
39
 						if (jobLogId != null && jobLogId > 0) {
43
 						if (jobLogId != null && jobLogId > 0) {
40
-							logger.info(">>>>>>>>>>> job monitor heat success, JobLogId:{}", jobLogId);
44
+							logger.debug(">>>>>>>>>>> job monitor heat success, JobLogId:{}", jobLogId);
41
 							XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId);
45
 							XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId);
42
 							if (log!=null) {
46
 							if (log!=null) {
43
 								if (ReturnT.SUCCESS_CODE==log.getTriggerCode() && log.getHandleCode()==0) {
47
 								if (ReturnT.SUCCESS_CODE==log.getTriggerCode() && log.getHandleCode()==0) {
73
 				}
77
 				}
74
 			}
78
 			}
75
 		});
79
 		});
80
+		monitorThread.setDaemon(true);
81
+		monitorThread.start();
82
+	}
83
+
84
+	public void stop(){
85
+		toStop = true;
86
+		//monitorThread.interrupt();
76
 	}
87
 	}
77
 	
88
 	
78
 	// producer
89
 	// producer
79
 	public static void monitor(int jobLogId){
90
 	public static void monitor(int jobLogId){
80
-		JobMonitorHelper.helper.queue.offer(jobLogId);
91
+		getInstance().queue.offer(jobLogId);
81
 	}
92
 	}
82
 	
93
 	
83
 }
94
 }

+ 18 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java View File

12
 import java.util.concurrent.TimeUnit;
12
 import java.util.concurrent.TimeUnit;
13
 
13
 
14
 /**
14
 /**
15
- * job registry helper
15
+ * job registry instance
16
  * @author xuxueli 2016-10-02 19:10:24
16
  * @author xuxueli 2016-10-02 19:10:24
17
  */
17
  */
18
 public class JobRegistryHelper {
18
 public class JobRegistryHelper {
19
 	private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
19
 	private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
20
 
20
 
21
-	private static JobRegistryHelper helper = new JobRegistryHelper();
21
+	private static JobRegistryHelper instance = new JobRegistryHelper();
22
+	public static JobRegistryHelper getInstance(){
23
+		return instance;
24
+	}
25
+
22
 	private ConcurrentHashMap<String, List<String>> registMap = new ConcurrentHashMap<String, List<String>>();
26
 	private ConcurrentHashMap<String, List<String>> registMap = new ConcurrentHashMap<String, List<String>>();
23
 
27
 
24
-	public JobRegistryHelper(){
25
-		Thread registryThread = new Thread(new Runnable() {
28
+	private Thread registryThread;
29
+	private boolean toStop = false;
30
+	public void start(){
31
+		registryThread = new Thread(new Runnable() {
26
 			@Override
32
 			@Override
27
 			public void run() {
33
 			public void run() {
28
-				while (true) {
34
+				while (!toStop) {
29
 					try {
35
 					try {
30
                         // registry admin
36
                         // registry admin
31
                         int ret = XxlJobDynamicScheduler.xxlJobRegistryDao.registryUpdate(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
37
                         int ret = XxlJobDynamicScheduler.xxlJobRegistryDao.registryUpdate(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
50
 						}
56
 						}
51
 						registMap = temp;
57
 						registMap = temp;
52
 					} catch (Exception e) {
58
 					} catch (Exception e) {
53
-						logger.error("job registry helper error:{}", e);
59
+						logger.error("job registry instance error:{}", e);
54
 					}
60
 					}
55
 					try {
61
 					try {
56
 						TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
62
 						TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
57
 					} catch (InterruptedException e) {
63
 					} catch (InterruptedException e) {
58
-						logger.error("job registry helper error:{}", e);
64
+						logger.error("job registry instance error:{}", e);
59
 					}
65
 					}
60
 				}
66
 				}
61
 			}
67
 			}
62
 		});
68
 		});
63
 		registryThread.setDaemon(true);
69
 		registryThread.setDaemon(true);
64
 		registryThread.start();
70
 		registryThread.start();
71
+	}
65
 
72
 
73
+	public void stop(){
74
+		toStop = true;
75
+		//registryThread.interrupt();
66
 	}
76
 	}
67
 
77
 
68
 	private static String makeGroupKey(String registryGroup, String registryKey){
78
 	private static String makeGroupKey(String registryGroup, String registryKey){
71
 	
81
 	
72
 	public static List<String> discover(String registryGroup, String registryKey){
82
 	public static List<String> discover(String registryGroup, String registryKey){
73
 		String groupKey = makeGroupKey(registryGroup, registryKey);
83
 		String groupKey = makeGroupKey(registryGroup, registryKey);
74
-		return helper.registMap.get(groupKey);
84
+		return instance.registMap.get(groupKey);
75
 	}
85
 	}
76
 	
86
 	
77
 }
87
 }

+ 1 - 1
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl View File

173
 <#macro commonFooter >
173
 <#macro commonFooter >
174
 	<footer class="main-footer">
174
 	<footer class="main-footer">
175
 		<div class="pull-right hidden-xs">
175
 		<div class="pull-right hidden-xs">
176
-			<b>Version</b> 1.5
176
+			<b>Version</b> 1.6
177
 		</div>
177
 		</div>
178
 		<strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
178
 		<strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
179
 			<a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>&nbsp;
179
 			<a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>&nbsp;

+ 2 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl View File

82
                                         <th name="executorHandler" >JobHandler</th>
82
                                         <th name="executorHandler" >JobHandler</th>
83
 					                  	<th name="executorParam" >任务参数</th>
83
 					                  	<th name="executorParam" >任务参数</th>
84
 					                  	<th name="triggerTime" >调度时间</th>
84
 					                  	<th name="triggerTime" >调度时间</th>
85
-					                  	<th name="triggerStatus" >调度结果</th>
85
+					                  	<th name="triggerCode" >调度结果</th>
86
 					                  	<th name="triggerMsg" >调度备注</th>
86
 					                  	<th name="triggerMsg" >调度备注</th>
87
 					                  	<th name="handleTime" >执行时间</th>
87
 					                  	<th name="handleTime" >执行时间</th>
88
-					                  	<th name="handleStatus" >执行结果</th>
88
+					                  	<th name="handleCode" >执行结果</th>
89
 					                  	<th name="handleMsg" >执行备注</th>
89
 					                  	<th name="handleMsg" >执行备注</th>
90
 					                  	<th name="handleMsg" >操作</th>
90
 					                  	<th name="handleMsg" >操作</th>
91
 					                </tr>
91
 					                </tr>

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

112
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
112
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
113
 	                	}
113
 	                	}
114
 	                },
114
 	                },
115
-	                { "data": 'triggerStatus'},
115
+	                {
116
+						"data": 'triggerCode',
117
+						"render": function ( data, type, row ) {
118
+							return (data==200)?'<span style="color: green">成功</span>':(data==500)?'<span style="color: red">失败</span>':(data==0)?'':data;
119
+						}
120
+
121
+	                },
116
 	                { 
122
 	                { 
117
 	                	"data": 'triggerMsg',
123
 	                	"data": 'triggerMsg',
118
 	                	"render": function ( data, type, row ) {
124
 	                	"render": function ( data, type, row ) {
125
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
131
 	                		return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):"";
126
 	                	}
132
 	                	}
127
 	                },
133
 	                },
128
-	                { "data": 'handleStatus',"bSortable": false},
134
+	                {
135
+						"data": 'handleCode',
136
+						"render": function ( data, type, row ) {
137
+							return (data==200)?'<span style="color: green">成功</span>':(data==500)?'<span style="color: red">失败</span>':(data==0)?'':data;
138
+						}
139
+	                },
129
 	                { 
140
 	                { 
130
 	                	"data": 'handleMsg',
141
 	                	"data": 'handleMsg',
131
 	                	"render": function ( data, type, row ) {
142
 	                	"render": function ( data, type, row ) {
136
 	                	"render": function ( data, type, row ) {
147
 	                	"render": function ( data, type, row ) {
137
 	                		// better support expression or string, not function
148
 	                		// better support expression or string, not function
138
 	                		return function () {
149
 	                		return function () {
139
-		                		if (row.triggerStatus == 'SUCCESS' || row.handleStatus){
150
+		                		if (row.triggerCode == 200){
140
 		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">执行日志</a>';
151
 		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">执行日志</a>';
141
-		                			if(!row.handleStatus){
152
+		                			if(row.handleCode == 0){
142
 		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'">终止任务</a>';
153
 		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'">终止任务</a>';
143
 		                			}
154
 		                			}
144
 		                			return temp;
155
 		                			return temp;

+ 2 - 2
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java View File

35
             IJobHandler handler = jobThread.getHandler();
35
             IJobHandler handler = jobThread.getHandler();
36
             jobThread.toStop("人工手动终止");
36
             jobThread.toStop("人工手动终止");
37
             jobThread.interrupt();
37
             jobThread.interrupt();
38
-            //XxlJobExecutor.registJobThread(jobKey, handler);
38
+            XxlJobExecutor.removeJobThread(jobKey);
39
             return ReturnT.SUCCESS;
39
             return ReturnT.SUCCESS;
40
         }
40
         }
41
 
41
 
42
-        return new ReturnT<String>(ReturnT.FAIL_CODE, "job thread not found.");
42
+        return new ReturnT<String>(ReturnT.SUCCESS_CODE, "job thread aleady killed.");
43
     }
43
     }
44
 
44
 
45
     @Override
45
     @Override

+ 3 - 0
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java View File

101
     public static JobThread loadJobThread(String jobKey){
101
     public static JobThread loadJobThread(String jobKey){
102
         return JobThreadRepository.get(jobKey);
102
         return JobThreadRepository.get(jobKey);
103
     }
103
     }
104
+    public static void removeJobThread(String jobKey){
105
+        JobThreadRepository.remove(jobKey);
106
+    }
104
 
107
 
105
 }
108
 }

+ 8 - 0
xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java View File

1
+package com.xxl.job.core.thread;
2
+
3
+/**
4
+ * Created by xuxueli on 17/3/2.
5
+ */
6
+public class ExecutorRegistryThread extends Thread {
7
+
8
+}