xueli.xue пре 8 година
родитељ
комит
b8e196606d

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Прегледај датотеку

@@ -149,8 +149,8 @@ public class JobLogController {
149 149
 		ReturnT<String> runResult = executorBiz.kill(String.valueOf(log.getJobGroup()), log.getJobName());
150 150
 
151 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 154
 			log.setHandleTime(new Date());
155 155
 			xxlJobLogDao.updateHandleInfo(log);
156 156
 			return new ReturnT<String>(runResult.getMsg());

+ 4 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Прегледај датотеку

@@ -74,14 +74,14 @@ public class RemoteHttpJobBean extends QuartzJobBean {
74 74
 		}
75 75
 
76 76
 		// failover trigger
77
-		ReturnT<String> responseModel = failoverTrigger(addressList, triggerParam, jobLog);
77
+		ReturnT<String> triggerResult = failoverTrigger(addressList, triggerParam, jobLog);
78 78
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
79 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 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 85
 		XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog);
86 86
 
87 87
 		// monitor triger

+ 12 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java Прегледај датотеку

@@ -2,6 +2,7 @@ package com.xxl.job.admin.core.schedule;
2 2
 
3 3
 import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.thread.JobMonitorHelper;
5 6
 import com.xxl.job.admin.core.thread.JobRegistryHelper;
6 7
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7 8
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
@@ -67,12 +68,21 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
67 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 78
     // destroy
75 79
     public void destroy(){
80
+        // admin registry stop
81
+        JobRegistryHelper.getInstance().stop();
82
+
83
+        // admin monitor stop
84
+        JobMonitorHelper.getInstance().stop();
85
+
76 86
         serverFactory.destroy();
77 87
     }
78 88
     

+ 22 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobMonitorHelper.java Прегледај датотеку

@@ -16,28 +16,32 @@ import java.util.Set;
16 16
 import java.util.concurrent.*;
17 17
 
18 18
 /**
19
- * job monitor helper
19
+ * job monitor instance
20 20
  * @author xuxueli 2015-9-1 18:05:56
21 21
  */
22 22
 public class JobMonitorHelper {
23 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 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 37
 			@Override
34 38
 			public void run() {
35 39
 				while (true) {
36 40
 					try {
37 41
 						logger.debug(">>>>>>>>>>> job monitor beat ... ");
38
-						Integer jobLogId = JobMonitorHelper.helper.queue.take();
42
+						Integer jobLogId = JobMonitorHelper.instance.queue.take();
39 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 45
 							XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId);
42 46
 							if (log!=null) {
43 47
 								if (ReturnT.SUCCESS_CODE==log.getTriggerCode() && log.getHandleCode()==0) {
@@ -73,11 +77,18 @@ public class JobMonitorHelper {
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 89
 	// producer
79 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 Прегледај датотеку

@@ -12,20 +12,26 @@ import java.util.concurrent.ConcurrentHashMap;
12 12
 import java.util.concurrent.TimeUnit;
13 13
 
14 14
 /**
15
- * job registry helper
15
+ * job registry instance
16 16
  * @author xuxueli 2016-10-02 19:10:24
17 17
  */
18 18
 public class JobRegistryHelper {
19 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 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 32
 			@Override
27 33
 			public void run() {
28
-				while (true) {
34
+				while (!toStop) {
29 35
 					try {
30 36
                         // registry admin
31 37
                         int ret = XxlJobDynamicScheduler.xxlJobRegistryDao.registryUpdate(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
@@ -50,19 +56,23 @@ public class JobRegistryHelper {
50 56
 						}
51 57
 						registMap = temp;
52 58
 					} catch (Exception e) {
53
-						logger.error("job registry helper error:{}", e);
59
+						logger.error("job registry instance error:{}", e);
54 60
 					}
55 61
 					try {
56 62
 						TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
57 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 69
 		registryThread.setDaemon(true);
64 70
 		registryThread.start();
71
+	}
65 72
 
73
+	public void stop(){
74
+		toStop = true;
75
+		//registryThread.interrupt();
66 76
 	}
67 77
 
68 78
 	private static String makeGroupKey(String registryGroup, String registryKey){
@@ -71,7 +81,7 @@ public class JobRegistryHelper {
71 81
 	
72 82
 	public static List<String> discover(String registryGroup, String registryKey){
73 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 Прегледај датотеку

@@ -173,7 +173,7 @@
173 173
 <#macro commonFooter >
174 174
 	<footer class="main-footer">
175 175
 		<div class="pull-right hidden-xs">
176
-			<b>Version</b> 1.5
176
+			<b>Version</b> 1.6
177 177
 		</div>
178 178
 		<strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
179 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 Прегледај датотеку

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

+ 15 - 4
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js Прегледај датотеку

@@ -112,7 +112,13 @@ $(function() {
112 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 123
 	                	"data": 'triggerMsg',
118 124
 	                	"render": function ( data, type, row ) {
@@ -125,7 +131,12 @@ $(function() {
125 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 141
 	                	"data": 'handleMsg',
131 142
 	                	"render": function ( data, type, row ) {
@@ -136,9 +147,9 @@ $(function() {
136 147
 	                	"render": function ( data, type, row ) {
137 148
 	                		// better support expression or string, not function
138 149
 	                		return function () {
139
-		                		if (row.triggerStatus == 'SUCCESS' || row.handleStatus){
150
+		                		if (row.triggerCode == 200){
140 151
 		                			var temp = '<a href="javascript:;" class="logDetail" _id="'+ row.id +'">执行日志</a>';
141
-		                			if(!row.handleStatus){
152
+		                			if(row.handleCode == 0){
142 153
 		                				temp += '<br><a href="javascript:;" class="logKill" _id="'+ row.id +'">终止任务</a>';
143 154
 		                			}
144 155
 		                			return temp;

+ 2 - 2
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java Прегледај датотеку

@@ -35,11 +35,11 @@ public class ExecutorBizImpl implements ExecutorBiz {
35 35
             IJobHandler handler = jobThread.getHandler();
36 36
             jobThread.toStop("人工手动终止");
37 37
             jobThread.interrupt();
38
-            //XxlJobExecutor.registJobThread(jobKey, handler);
38
+            XxlJobExecutor.removeJobThread(jobKey);
39 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 45
     @Override

+ 3 - 0
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java Прегледај датотеку

@@ -101,5 +101,8 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
101 101
     public static JobThread loadJobThread(String jobKey){
102 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 Прегледај датотеку

@@ -0,0 +1,8 @@
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
+}