Sfoglia il codice sorgente

重要重构:底层通讯模块升级优化;

xueli.xue 8 anni fa
parent
commit
86dea7ff7c
56 ha cambiato i file con 1538 aggiunte e 1863 eliminazioni
  1. 1 1
      pom.xml
  2. 2 2
      xxl-job-admin/pom.xml
  3. 6 7
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java
  4. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
  5. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
  6. 3 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
  7. 29 27
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
  8. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java
  9. 84 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/biz/AdminBizImpl.java
  10. 0 62
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java
  11. 0 122
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServerHandler.java
  12. 53 42
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
  13. 296 300
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/DynamicSchedulerUtil.java
  14. 5 5
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobMonitorHelper.java
  15. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java
  16. 0 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java
  17. 93 93
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java
  18. 5 4
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java
  19. 5 5
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  20. 1 1
      xxl-job-admin/src/main/resources/applicationcontext-xxl-job.xml
  21. 0 61
      xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java
  22. 8 1
      xxl-job-core/pom.xml
  23. 13 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java
  24. 40 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/ExecutorBiz.java
  25. 112 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java
  26. 55 50
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/ReturnT.java
  27. 4 13
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
  28. 105 0
      xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
  29. 0 158
      xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java
  30. 0 56
      xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutorHandler.java
  31. 0 61
      xxl-job-core/src/main/java/com/xxl/job/core/executor/servlet/XxlJobServlet.java
  32. 1 3
      xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java
  33. 0 100
      xxl-job-core/src/main/java/com/xxl/job/core/router/HandlerRouter.java
  34. 0 13
      xxl-job-core/src/main/java/com/xxl/job/core/router/IAction.java
  35. 0 17
      xxl-job-core/src/main/java/com/xxl/job/core/router/action/BeatAction.java
  36. 0 35
      xxl-job-core/src/main/java/com/xxl/job/core/router/action/KillAction.java
  37. 0 24
      xxl-job-core/src/main/java/com/xxl/job/core/router/action/LogAction.java
  38. 0 76
      xxl-job-core/src/main/java/com/xxl/job/core/router/action/RunAction.java
  39. 0 45
      xxl-job-core/src/main/java/com/xxl/job/core/router/model/ResponseModel.java
  40. 69 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java
  41. 41 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcResponse.java
  42. 73 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java
  43. 77 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java
  44. 20 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java
  45. 107 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java
  46. 47 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServerHandler.java
  47. 37 0
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/serialize/HessianSerializer.java
  48. 31 31
      xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
  49. 15 10
      xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java
  50. 0 90
      xxl-job-core/src/main/java/com/xxl/job/core/util/ByteHexConverter.java
  51. 0 98
      xxl-job-core/src/main/java/com/xxl/job/core/util/ByteReadFactory.java
  52. 0 67
      xxl-job-core/src/main/java/com/xxl/job/core/util/ByteWriteFactory.java
  53. 92 0
      xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java
  54. 0 170
      xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobNetCommUtil.java
  55. 2 2
      xxl-job-executor-example/pom.xml
  56. 1 1
      xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml

+ 1 - 1
pom.xml Vedi File

@@ -3,7 +3,7 @@
3 3
 	<modelVersion>4.0.0</modelVersion>
4 4
 	<groupId>com.xuxueli</groupId>
5 5
 	<artifactId>xxl-job</artifactId>
6
-	<version>1.6.0</version>
6
+	<version>1.6.0-SNAPSHOT</version>
7 7
 	<packaging>pom</packaging>
8 8
 
9 9
 	<name>xxl-job</name>

+ 2 - 2
xxl-job-admin/pom.xml Vedi File

@@ -4,13 +4,13 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.6.0</version>
7
+		<version>1.6.0-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-admin</artifactId>
10 10
 	<packaging>war</packaging>
11 11
 
12 12
 	<properties>
13
-		<xxl-job.version>1.6.0</xxl-job.version>
13
+		<xxl-job.version>1.6.0-SNAPSHOT</xxl-job.version>
14 14
 		<spring.version>3.2.17.RELEASE</spring.version>
15 15
 	</properties>
16 16
 

+ 6 - 7
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java Vedi File

@@ -1,8 +1,9 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import javax.servlet.http.HttpServletRequest;
4
-import javax.servlet.http.HttpServletResponse;
5
-
3
+import com.xxl.job.admin.controller.annotation.PermessionLimit;
4
+import com.xxl.job.admin.controller.interceptor.PermissionInterceptor;
5
+import com.xxl.job.admin.core.util.PropertiesUtil;
6
+import com.xxl.job.core.biz.model.ReturnT;
6 7
 import org.apache.commons.lang.StringUtils;
7 8
 import org.springframework.stereotype.Controller;
8 9
 import org.springframework.ui.Model;
@@ -10,10 +11,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
10 11
 import org.springframework.web.bind.annotation.RequestMethod;
11 12
 import org.springframework.web.bind.annotation.ResponseBody;
12 13
 
13
-import com.xxl.job.admin.controller.annotation.PermessionLimit;
14
-import com.xxl.job.admin.controller.interceptor.PermissionInterceptor;
15
-import com.xxl.job.admin.core.model.ReturnT;
16
-import com.xxl.job.admin.core.util.PropertiesUtil;
14
+import javax.servlet.http.HttpServletRequest;
15
+import javax.servlet.http.HttpServletResponse;
17 16
 
18 17
 /**
19 18
  * index controller

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

@@ -1,10 +1,10 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4 3
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 4
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
6 5
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
7 6
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
7
+import com.xxl.job.core.biz.model.ReturnT;
8 8
 import org.apache.commons.lang.StringUtils;
9 9
 import org.springframework.stereotype.Controller;
10 10
 import org.springframework.ui.Model;

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

@@ -1,10 +1,10 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 4
 import com.xxl.job.admin.core.thread.JobRegistryHelper;
6 5
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
7 6
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
7
+import com.xxl.job.core.biz.model.ReturnT;
8 8
 import com.xxl.job.core.registry.RegistHelper;
9 9
 import org.apache.commons.collections.CollectionUtils;
10 10
 import org.apache.commons.lang.StringUtils;

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Vedi File

@@ -1,9 +1,9 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 4
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
6 5
 import com.xxl.job.admin.service.IXxlJobService;
6
+import com.xxl.job.core.biz.model.ReturnT;
7 7
 import org.springframework.stereotype.Controller;
8 8
 import org.springframework.ui.Model;
9 9
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -49,8 +49,8 @@ public class JobInfoController {
49 49
 	@RequestMapping("/add")
50 50
 	@ResponseBody
51 51
 	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
52
-			String executorAppname, String executorAddress, String executorHandler, String executorParam,
53
-			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
52
+							   String executorAppname, String executorAddress, String executorHandler, String executorParam,
53
+							   int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
54 54
 		
55 55
 		return xxlJobService.add(jobGroup, jobCron, jobDesc, author, alarmEmail,
56 56
 				executorAddress, executorHandler, executorParam,

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

@@ -1,16 +1,14 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
6 5
 import com.xxl.job.admin.core.model.XxlJobLog;
7 6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
8 7
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
9 8
 import com.xxl.job.admin.dao.IXxlJobLogDao;
10
-import com.xxl.job.core.router.HandlerRouter.ActionRepository;
11
-import com.xxl.job.core.router.model.RequestModel;
12
-import com.xxl.job.core.router.model.ResponseModel;
13
-import com.xxl.job.core.util.XxlJobNetCommUtil;
9
+import com.xxl.job.core.biz.ExecutorBiz;
10
+import com.xxl.job.core.biz.model.ReturnT;
11
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
14 12
 import org.apache.commons.lang.StringUtils;
15 13
 import org.apache.commons.lang.time.DateUtils;
16 14
 import org.springframework.stereotype.Controller;
@@ -99,22 +97,24 @@ public class JobLogController {
99 97
 		if (log == null) {
100 98
 			return new ReturnT<String>(500, "查看执行日志失败: 参数异常");
101 99
 		}
102
-		if (!(ResponseModel.SUCCESS.equals(log.getTriggerStatus()) || StringUtils.isNotBlank(log.getHandleStatus()))) {
100
+		if (!((ReturnT.SUCCESS_CODE+"").equals(log.getTriggerStatus()) || StringUtils.isNotBlank(log.getHandleStatus()))) {
103 101
 			return new ReturnT<String>(500, "查看执行日志失败: 任务发起调度失败,无法查看执行日志");
104 102
 		}
105 103
 		
106 104
 		// trigger id, trigger time
107
-		RequestModel requestModel = new RequestModel();
108
-		requestModel.setTimestamp(System.currentTimeMillis());
109
-		requestModel.setAction(ActionRepository.LOG.name());
110
-		requestModel.setLogId(id);
111
-		requestModel.setLogDateTim(log.getTriggerTime().getTime());
105
+		ExecutorBiz executorBiz = null;
106
+		try {
107
+			executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, log.getExecutorAddress()).getObject();
108
+		} catch (Exception e) {
109
+			e.printStackTrace();
110
+			return new ReturnT<String>(500, e.getMessage());
111
+		}
112
+		ReturnT<String> logResult = executorBiz.log(log.getTriggerTime().getTime(), id);
112 113
 
113
-		ResponseModel responseModel = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(log.getExecutorAddress()), requestModel);
114
-		if (ResponseModel.SUCCESS.equals(responseModel.getStatus())) {
115
-			return new ReturnT<String>(responseModel.getMsg());
114
+		if (ReturnT.SUCCESS_CODE == logResult.getCode()) {
115
+			return new ReturnT<String>(logResult.getMsg());
116 116
 		} else {
117
-			return new ReturnT<String>(500, "查看执行日志失败: " + responseModel.getMsg());
117
+			return new ReturnT<String>(500, "查看执行日志失败: " + logResult.getMsg());
118 118
 		}
119 119
 	}
120 120
 	
@@ -134,26 +134,28 @@ public class JobLogController {
134 134
 		if (log == null || jobInfo==null) {
135 135
 			return new ReturnT<String>(500, "参数异常");
136 136
 		}
137
-		if (!ResponseModel.SUCCESS.equals(log.getTriggerStatus())) {
137
+		if (!(ReturnT.SUCCESS_CODE +"").equals(log.getTriggerStatus())) {
138 138
 			return new ReturnT<String>(500, "调度失败,无法终止日志");
139 139
 		}
140
-		
140
+
141 141
 		// request of kill
142
-		RequestModel requestModel = new RequestModel();
143
-		requestModel.setTimestamp(System.currentTimeMillis());
144
-		requestModel.setAction(ActionRepository.KILL.name());
145
-		requestModel.setJobGroup(String.valueOf(log.getJobGroup()));
146
-		requestModel.setJobName(log.getJobName());
142
+		ExecutorBiz executorBiz = null;
143
+		try {
144
+			executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, log.getExecutorAddress()).getObject();
145
+		} catch (Exception e) {
146
+			e.printStackTrace();
147
+			return new ReturnT<String>(500, e.getMessage());
148
+		}
149
+		ReturnT<String> runResult = executorBiz.kill(String.valueOf(log.getJobGroup()), log.getJobName());
147 150
 
148
-		ResponseModel responseModel = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(log.getExecutorAddress()), requestModel);
149
-		if (ResponseModel.SUCCESS.equals(responseModel.getStatus())) {
150
-			log.setHandleStatus(ResponseModel.FAIL);
151
+		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
152
+			log.setHandleStatus(ReturnT.SUCCESS_CODE+"");
151 153
 			log.setHandleMsg("人为操作主动终止");
152 154
 			log.setHandleTime(new Date());
153 155
 			xxlJobLogDao.updateHandleInfo(log);
154
-			return new ReturnT<String>(responseModel.getMsg());
156
+			return new ReturnT<String>(runResult.getMsg());
155 157
 		} else {
156
-			return new ReturnT<String>(500, responseModel.getMsg());
158
+			return new ReturnT<String>(500, runResult.getMsg());
157 159
 		}
158 160
 	}
159 161
 }

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java Vedi File

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.controller.resolver;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4
-import com.xxl.job.core.util.JacksonUtil;
3
+import com.xxl.job.admin.core.util.JacksonUtil;
4
+import com.xxl.job.core.biz.model.ReturnT;
5 5
 import org.slf4j.Logger;
6 6
 import org.slf4j.LoggerFactory;
7 7
 import org.springframework.web.bind.annotation.ResponseBody;

+ 84 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/biz/AdminBizImpl.java Vedi File

@@ -0,0 +1,84 @@
1
+package com.xxl.job.admin.core.biz;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobInfo;
4
+import com.xxl.job.admin.core.model.XxlJobLog;
5
+import com.xxl.job.admin.core.schedule.DynamicSchedulerUtil;
6
+import com.xxl.job.core.biz.AdminBiz;
7
+import com.xxl.job.core.biz.model.ReturnT;
8
+import com.xxl.job.core.biz.model.TriggerParam;
9
+import org.apache.commons.lang.StringUtils;
10
+import org.quartz.SchedulerException;
11
+import org.slf4j.Logger;
12
+import org.slf4j.LoggerFactory;
13
+
14
+import java.text.MessageFormat;
15
+import java.util.Date;
16
+
17
+/**
18
+ * Created by xuxueli on 17/3/1.
19
+ */
20
+public class AdminBizImpl implements AdminBiz {
21
+    private static Logger logger = LoggerFactory.getLogger(AdminBizImpl.class);
22
+
23
+    @Override
24
+    public ReturnT<String> callback(TriggerParam triggerParam) {
25
+
26
+        // valid log item
27
+        XxlJobLog log = DynamicSchedulerUtil.xxlJobLogDao.load(triggerParam.getLogId());
28
+        if (log == null) {
29
+            return new ReturnT(ReturnT.FAIL_CODE, "log item not found.");
30
+        }
31
+
32
+        // trigger success, to trigger child job, and avoid repeat trigger child job
33
+        String childTriggerMsg = null;
34
+        if ((ReturnT.SUCCESS_CODE+"").equals(triggerParam.getStatus()) && !(ReturnT.SUCCESS_CODE+"").equals(log.getHandleStatus())) {
35
+            XxlJobInfo xxlJobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
36
+            if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
37
+                childTriggerMsg = "<hr>";
38
+                String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
39
+                for (int i = 0; i < childJobKeys.length; i++) {
40
+                    String[] jobKeyArr = childJobKeys[i].split("_");
41
+                    if (jobKeyArr!=null && jobKeyArr.length==2) {
42
+                        XxlJobInfo childJobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(Integer.valueOf(jobKeyArr[0]), jobKeyArr[1]);
43
+                        if (childJobInfo!=null) {
44
+                            try {
45
+                                boolean ret = DynamicSchedulerUtil.triggerJob(childJobInfo.getJobName(), String.valueOf(childJobInfo.getJobGroup()));
46
+
47
+                                // add msg
48
+                                childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
49
+                                        (i+1), childJobKeys.length, childJobKeys[i], ret, childJobInfo.getJobDesc());
50
+                            } catch (SchedulerException e) {
51
+                                logger.error("", e);
52
+                            }
53
+                        } else {
54
+                            childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务xxlJobInfo不存在, 子任务Key: {2}",
55
+                                    (i+1), childJobKeys.length, childJobKeys[i]);
56
+                        }
57
+                    } else {
58
+                        childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}",
59
+                                (i+1), childJobKeys.length, childJobKeys[i]);
60
+                    }
61
+                }
62
+
63
+            }
64
+        }
65
+
66
+        // handle msg
67
+        StringBuffer handleMsg = new StringBuffer();
68
+        if (triggerParam.getMsg() != null) {
69
+            handleMsg.append("执行备注:").append(triggerParam.getMsg());
70
+        }
71
+        if (childTriggerMsg !=null) {
72
+            handleMsg.append("<br>子任务触发备注:").append(childTriggerMsg);
73
+        }
74
+
75
+        // success, save log
76
+        log.setHandleTime(new Date());
77
+        log.setHandleStatus(triggerParam.getStatus());
78
+        log.setHandleMsg(handleMsg.toString());
79
+        DynamicSchedulerUtil.xxlJobLogDao.updateHandleInfo(log);
80
+
81
+        return new ReturnT(ReturnT.SUCCESS_CODE, null);
82
+    }
83
+
84
+}

+ 0 - 62
xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServer.java Vedi File

@@ -1,62 +0,0 @@
1
-package com.xxl.job.admin.core.callback;
2
-
3
-import org.eclipse.jetty.server.Connector;
4
-import org.eclipse.jetty.server.Handler;
5
-import org.eclipse.jetty.server.Server;
6
-import org.eclipse.jetty.server.handler.HandlerCollection;
7
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
8
-import org.eclipse.jetty.util.thread.ExecutorThreadPool;
9
-import org.slf4j.Logger;
10
-import org.slf4j.LoggerFactory;
11
-
12
-/**
13
- * Created by xuxueli on 2016-5-22 11:15:42
14
- */
15
-public class XxlJobLogCallbackServer {
16
-    private static final Logger logger = LoggerFactory.getLogger(XxlJobLogCallbackServer.class);
17
-
18
-    private Server server = null;
19
-    public void start(int callBackPort) throws Exception {
20
-
21
-    	final int port = Integer.valueOf(callBackPort);
22
-        new Thread(new Runnable() {
23
-            @Override
24
-            public void run() {
25
-                server = new Server();
26
-                server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
27
-
28
-                // connector
29
-                SelectChannelConnector connector = new SelectChannelConnector();
30
-                connector.setPort(port);
31
-                connector.setMaxIdleTime(30000);
32
-                server.setConnectors(new Connector[] { connector });
33
-
34
-                // handler
35
-                HandlerCollection handlerc =new HandlerCollection();
36
-                handlerc.setHandlers(new Handler[]{new XxlJobLogCallbackServerHandler()});
37
-                server.setHandler(handlerc);
38
-
39
-                try {
40
-                    server.start();
41
-                    logger.info(">>>>>>>>>>>> xxl-job XxlJobCallbackServer start success at port:{}.", port);
42
-                    server.join();  // block until server ready
43
-                    logger.info(">>>>>>>>>>>> xxl-job XxlJobCallbackServer join success at port:{}.", port);
44
-                } catch (Exception e) {
45
-                    e.printStackTrace();
46
-                }
47
-            }
48
-        }).start();
49
-
50
-    }
51
-
52
-	public void destroy() {
53
-		if (server!=null) {
54
-			try {
55
-				server.stop();
56
-			} catch (Exception e) {
57
-				e.printStackTrace();
58
-			}
59
-		}
60
-	}
61
-
62
-}

+ 0 - 122
xxl-job-admin/src/main/java/com/xxl/job/admin/core/callback/XxlJobLogCallbackServerHandler.java Vedi File

@@ -1,122 +0,0 @@
1
-package com.xxl.job.admin.core.callback;
2
-
3
-import com.xxl.job.admin.core.model.XxlJobInfo;
4
-import com.xxl.job.admin.core.model.XxlJobLog;
5
-import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
6
-import com.xxl.job.core.router.model.RequestModel;
7
-import com.xxl.job.core.router.model.ResponseModel;
8
-import com.xxl.job.core.util.XxlJobNetCommUtil;
9
-import org.apache.commons.lang.StringUtils;
10
-import org.eclipse.jetty.server.Request;
11
-import org.eclipse.jetty.server.handler.AbstractHandler;
12
-import org.quartz.SchedulerException;
13
-import org.slf4j.Logger;
14
-import org.slf4j.LoggerFactory;
15
-
16
-import javax.servlet.ServletException;
17
-import javax.servlet.http.HttpServletRequest;
18
-import javax.servlet.http.HttpServletResponse;
19
-import java.io.IOException;
20
-import java.text.MessageFormat;
21
-import java.util.Date;
22
-
23
-/**
24
- * Created by xuxueli on 2016-5-22 11:15:42
25
- */
26
-public class XxlJobLogCallbackServerHandler extends AbstractHandler {
27
-	private static Logger logger = LoggerFactory.getLogger(XxlJobLogCallbackServerHandler.class);
28
-
29
-	@Override
30
-	public void handle(String s, Request baseRequest, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
31
-
32
-		httpServletRequest.setCharacterEncoding("UTF-8");
33
-		httpServletResponse.setCharacterEncoding("UTF-8");
34
-
35
-		// parse hex-json to request model
36
-		String requestHex = httpServletRequest.getParameter(XxlJobNetCommUtil.HEX);
37
-
38
-		// do biz
39
-		ResponseModel responseModel = dobiz(requestHex);
40
-
41
-		// format response model to hex-json
42
-		String responseHex = XxlJobNetCommUtil.formatObj2HexJson(responseModel);
43
-
44
-		// response
45
-		httpServletResponse.setContentType("text/html;charset=utf-8");
46
-		httpServletResponse.setStatus(HttpServletResponse.SC_OK);
47
-		baseRequest.setHandled(true);
48
-		httpServletResponse.getWriter().println(responseHex);
49
-	}
50
-
51
-	private ResponseModel dobiz(String requestHex){
52
-
53
-		// valid hex
54
-		if (requestHex==null || requestHex.trim().length()==0) {
55
-			return new ResponseModel(ResponseModel.FAIL, "request hex is null.");
56
-		}
57
-
58
-		// valid request model
59
-		RequestModel requestModel = XxlJobNetCommUtil.parseHexJson2Obj(requestHex, RequestModel.class);
60
-		if (requestModel==null) {
61
-			return new ResponseModel(ResponseModel.FAIL, "request hex parse fail.");
62
-		}
63
-
64
-		// valid log item
65
-		XxlJobLog log = DynamicSchedulerUtil.xxlJobLogDao.load(requestModel.getLogId());
66
-		if (log == null) {
67
-			return new ResponseModel(ResponseModel.FAIL, "log item not found.");
68
-		}
69
-
70
-		// trigger success, to trigger child job, and avoid repeat trigger child job
71
-		String childTriggerMsg = null;
72
-		if (ResponseModel.SUCCESS.equals(requestModel.getStatus()) && !ResponseModel.SUCCESS.equals(log.getHandleStatus())) {
73
-			XxlJobInfo xxlJobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
74
-			if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
75
-				childTriggerMsg = "<hr>";
76
-				String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
77
-				for (int i = 0; i < childJobKeys.length; i++) {
78
-					String[] jobKeyArr = childJobKeys[i].split("_");
79
-					if (jobKeyArr!=null && jobKeyArr.length==2) {
80
-						XxlJobInfo childJobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(Integer.valueOf(jobKeyArr[0]), jobKeyArr[1]);
81
-						if (childJobInfo!=null) {
82
-							try {
83
-								boolean ret = DynamicSchedulerUtil.triggerJob(childJobInfo.getJobName(), String.valueOf(childJobInfo.getJobGroup()));
84
-
85
-								// add msg
86
-								childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
87
-										(i+1), childJobKeys.length, childJobKeys[i], ret, childJobInfo.getJobDesc());
88
-							} catch (SchedulerException e) {
89
-								logger.error("", e);
90
-							}
91
-						} else {
92
-							childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务xxlJobInfo不存在, 子任务Key: {2}",
93
-									(i+1), childJobKeys.length, childJobKeys[i]);
94
-						}
95
-					} else {
96
-						childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}",
97
-								(i+1), childJobKeys.length, childJobKeys[i]);
98
-					}
99
-				}
100
-
101
-			}
102
-		}
103
-
104
-		// handle msg
105
-		StringBuffer handleMsg = new StringBuffer();
106
-        if (requestModel.getMsg() != null) {
107
-            handleMsg.append("执行备注:").append(requestModel.getMsg());
108
-        }
109
-		if (childTriggerMsg !=null) {
110
-			handleMsg.append("<br>子任务触发备注:").append(childTriggerMsg);
111
-		}
112
-
113
-		// success, save log
114
-		log.setHandleTime(new Date());
115
-		log.setHandleStatus(requestModel.getStatus());
116
-		log.setHandleMsg(handleMsg.toString());
117
-		DynamicSchedulerUtil.xxlJobLogDao.updateHandleInfo(log);
118
-
119
-		return new ResponseModel(ResponseModel.SUCCESS, null);
120
-	}
121
-
122
-}

+ 53 - 42
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Vedi File

@@ -5,12 +5,12 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.model.XxlJobLog;
6 6
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
7 7
 import com.xxl.job.admin.core.thread.JobRegistryHelper;
8
-import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
8
+import com.xxl.job.admin.core.schedule.DynamicSchedulerUtil;
9
+import com.xxl.job.core.biz.ExecutorBiz;
10
+import com.xxl.job.core.biz.model.ReturnT;
11
+import com.xxl.job.core.biz.model.TriggerParam;
9 12
 import com.xxl.job.core.registry.RegistHelper;
10
-import com.xxl.job.core.router.HandlerRouter.ActionRepository;
11
-import com.xxl.job.core.router.model.RequestModel;
12
-import com.xxl.job.core.router.model.ResponseModel;
13
-import com.xxl.job.core.util.XxlJobNetCommUtil;
13
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
14 14
 import org.apache.commons.lang.StringUtils;
15 15
 import org.quartz.JobExecutionContext;
16 16
 import org.quartz.JobExecutionException;
@@ -56,17 +56,15 @@ public class RemoteHttpJobBean extends QuartzJobBean {
56 56
 		jobLog.setTriggerTime(new Date());
57 57
 
58 58
 		// trigger request
59
-		RequestModel requestModel = new RequestModel();
60
-		requestModel.setTimestamp(System.currentTimeMillis());
61
-		requestModel.setAction(ActionRepository.RUN.name());
62
-		requestModel.setJobGroup(String.valueOf(jobInfo.getJobGroup()));
63
-		requestModel.setJobName(jobInfo.getJobName());
64
-		requestModel.setExecutorHandler(jobInfo.getExecutorHandler());
65
-		requestModel.setExecutorParams(jobInfo.getExecutorParam());
66
-		requestModel.setGlueSwitch((jobInfo.getGlueSwitch()==0)?false:true);
67
-		requestModel.setLogAddress(adminAddressSet);
68
-		requestModel.setLogId(jobLog.getId());
69
-		requestModel.setLogDateTim(jobLog.getTriggerTime().getTime());
59
+		TriggerParam triggerParam = new TriggerParam();
60
+		triggerParam.setJobGroup(String.valueOf(jobInfo.getJobGroup()));
61
+		triggerParam.setJobName(jobInfo.getJobName());
62
+		triggerParam.setExecutorHandler(jobInfo.getExecutorHandler());
63
+		triggerParam.setExecutorParams(jobInfo.getExecutorParam());
64
+		triggerParam.setGlueSwitch((jobInfo.getGlueSwitch()==0)?false:true);
65
+		triggerParam.setLogAddress(adminAddressSet);
66
+		triggerParam.setLogId(jobLog.getId());
67
+		triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
70 68
 
71 69
 		// parse address
72 70
 		List<String> addressList = new ArrayList<String>();
@@ -76,13 +74,13 @@ public class RemoteHttpJobBean extends QuartzJobBean {
76 74
 		}
77 75
 
78 76
 		// failover trigger
79
-		ResponseModel responseModel = failoverTrigger(addressList, requestModel, jobLog);
77
+		ReturnT<String> responseModel = failoverTrigger(addressList, triggerParam, jobLog);
80 78
 		jobLog.setExecutorHandler(jobInfo.getExecutorHandler());
81 79
 		jobLog.setExecutorParam(jobInfo.getExecutorParam());
82 80
 		logger.info(">>>>>>>>>>> xxl-job failoverTrigger response, jobId:{}, responseModel:{}", jobLog.getId(), responseModel.toString());
83 81
 		
84 82
 		// update trigger info 2/2
85
-		jobLog.setTriggerStatus(responseModel.getStatus());
83
+		jobLog.setTriggerStatus(responseModel.getCode()+"");
86 84
 		jobLog.setTriggerMsg(responseModel.getMsg());
87 85
 		DynamicSchedulerUtil.xxlJobLogDao.updateTriggerInfo(jobLog);
88 86
 
@@ -97,21 +95,28 @@ public class RemoteHttpJobBean extends QuartzJobBean {
97 95
 	 * failover for trigger remote address
98 96
 	 * @return
99 97
 	 */
100
-	public ResponseModel failoverTrigger(List<String> addressList, RequestModel requestModel, XxlJobLog jobLog){
98
+	public ReturnT<String> failoverTrigger(List<String> addressList, TriggerParam triggerParam, XxlJobLog jobLog){
101 99
 		 if (addressList==null || addressList.size() < 1) {
102
-			ResponseModel result = new ResponseModel();
103
-			result.setStatus(ResponseModel.FAIL);
104
-			result.setMsg( "Trigger error, <br>>>>[address] is null <br><hr>" );
105
-			return result;
100
+			 return new ReturnT<String>(ReturnT.FAIL_CODE, "Trigger error, <br>>>>[address] is null <br><hr>");
106 101
 		} else if (addressList.size() == 1) {
107 102
 			 String address = addressList.get(0);
108 103
 			 // store real address
109 104
 			 jobLog.setExecutorAddress(address);
110 105
 
111
-			 ResponseModel triggerCallback = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(address), requestModel);
112
-			 String failoverMessage = MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>", address, triggerCallback.getStatus(), triggerCallback.getMsg());
113
-			 triggerCallback.setMsg(failoverMessage);
114
-			 return triggerCallback;
106
+			 // real trigger
107
+			 ExecutorBiz executorBiz = null;
108
+			 try {
109
+				 executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject();
110
+			 } catch (Exception e) {
111
+				 e.printStackTrace();
112
+				 return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
113
+			 }
114
+			 ReturnT<String> runResult = executorBiz.run(triggerParam);
115
+
116
+			 String failoverMessage = MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[code] : {1}, <br>>>>[msg] : {2} <br><hr>",
117
+					 address, runResult.getCode(), runResult.getMsg());
118
+			 runResult.setMsg(runResult.getMsg() + failoverMessage);
119
+			 return runResult;
115 120
 		 } else {
116 121
 			
117 122
 			// for ha
@@ -122,32 +127,38 @@ public class RemoteHttpJobBean extends QuartzJobBean {
122 127
 			for (String address : addressList) {
123 128
 				if (StringUtils.isNotBlank(address)) {
124 129
 
125
-					// beat check
126
-					RequestModel beatRequest = new RequestModel();
127
-					beatRequest.setTimestamp(System.currentTimeMillis());
128
-					beatRequest.setAction(ActionRepository.BEAT.name());
129
-					ResponseModel beatResult = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(address), beatRequest);
130
-					failoverMessage += MessageFormat.format("BEAT running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>", address, beatResult.getStatus(), beatResult.getMsg());
130
+
131
+                    ExecutorBiz executorBiz = null;
132
+                    try {
133
+                        executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject();
134
+                    } catch (Exception e) {
135
+                        e.printStackTrace();
136
+                        return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
137
+                    }
138
+
139
+                    // beat check
140
+					ReturnT<String> beatResult = executorBiz.beat();
141
+					failoverMessage += MessageFormat.format("BEAT running, <br>>>>[address] : {0}, <br>>>>[code] : {1}, <br>>>>[msg] : {2} <br><hr>",
142
+							address, beatResult.getCode(), beatResult.getMsg());
131 143
 
132 144
 					// beat success, trigger do
133
-					if (beatResult.SUCCESS.equals(beatResult.getStatus())) {
145
+					if (beatResult.getCode() == ReturnT.SUCCESS_CODE) {
134 146
 						// store real address
135 147
 						jobLog.setExecutorAddress(address);
136 148
 
137 149
 						// real trigger
138
-						ResponseModel triggerCallback = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(address), requestModel);
139
-						failoverMessage += MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>", address, triggerCallback.getStatus(), triggerCallback.getMsg());
140
-						triggerCallback.setMsg(failoverMessage);
141
-						return triggerCallback;
150
+						ReturnT<String> runResult = executorBiz.run(triggerParam);
151
+
152
+						failoverMessage += MessageFormat.format("Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>",
153
+								address, runResult.getCode(), runResult.getMsg());
154
+						runResult.setMsg( runResult.getMsg() + failoverMessage);
155
+						return runResult;
142 156
 					}
143 157
 
144 158
 				}
145 159
 			}
146 160
 
147
-			ResponseModel result = new ResponseModel();
148
-			result.setStatus(ResponseModel.FAIL);
149
-			result.setMsg(failoverMessage);
150
-			return result;
161
+			return new ReturnT<String>(ReturnT.FAIL_CODE, failoverMessage);
151 162
 		}
152 163
 	}
153 164
 

xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/DynamicSchedulerUtil.java → xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/DynamicSchedulerUtil.java Vedi File

@@ -1,301 +1,297 @@
1
-package com.xxl.job.admin.core.util;
2
-
3
-import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
4
-import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
5
-import com.xxl.job.admin.core.model.XxlJobInfo;
6
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
7
-import com.xxl.job.admin.dao.IXxlJobGroupDao;
8
-import com.xxl.job.admin.dao.IXxlJobInfoDao;
9
-import com.xxl.job.admin.dao.IXxlJobLogDao;
10
-import com.xxl.job.admin.dao.IXxlJobRegistryDao;
11
-import com.xxl.job.core.util.IpUtil;
12
-import org.quartz.*;
13
-import org.quartz.Trigger.TriggerState;
14
-import org.quartz.impl.matchers.GroupMatcher;
15
-import org.quartz.impl.triggers.CronTriggerImpl;
16
-import org.slf4j.Logger;
17
-import org.slf4j.LoggerFactory;
18
-import org.springframework.beans.BeansException;
19
-import org.springframework.beans.factory.InitializingBean;
20
-import org.springframework.context.ApplicationContext;
21
-import org.springframework.context.ApplicationContextAware;
22
-import org.springframework.util.Assert;
23
-
24
-import java.util.*;
25
-
26
-/**
27
- * base quartz scheduler util
28
- * @author xuxueli 2015-12-19 16:13:53
29
- */
30
-public final class DynamicSchedulerUtil implements ApplicationContextAware, InitializingBean {
31
-    private static final Logger logger = LoggerFactory.getLogger(DynamicSchedulerUtil.class);
32
-    
33
-    // Scheduler
34
-    private static Scheduler scheduler;
35
-    public static void setScheduler(Scheduler scheduler) {
36
-		DynamicSchedulerUtil.scheduler = scheduler;
37
-	}
38
-    
39
-    // trigger callback address
40
-    private String callBackIp;
41
-    private int callBackPort = 8888;
42
-    private static String callbackAddress;
43
-
44
-    public void setCallBackIp(String callBackIp) {
45
-        this.callBackIp = callBackIp;
46
-    }
47
-    public void setCallBackPort(int callBackPort) {
48
-		this.callBackPort = callBackPort;
49
-	}
50
-    public static String getCallbackAddress(){
51
-        return callbackAddress;
52
-    }
53
-
54
-    // init
55
-    XxlJobLogCallbackServer xxlJobLogCallbackServer = null;
56
-    public void init(){
57
-    	try {
58
-    		// start callback server
59
-    		xxlJobLogCallbackServer = new XxlJobLogCallbackServer();
60
-    		xxlJobLogCallbackServer.start(callBackPort);
61
-		} catch (Exception e) {
62
-			e.printStackTrace();
63
-		}
64
-
65
-		// init callbackAddress
66
-        if (callBackIp!=null && callBackIp.trim().length()>0) {
67
-            callbackAddress = callBackIp.trim().concat(":").concat(String.valueOf(callBackPort));
68
-        } else {
69
-            callbackAddress = IpUtil.getIpPort(callBackPort);;
70
-        }
71
-
72
-		// init JobRegistryHelper
73
-        JobRegistryHelper.discover("g", "k");
74
-    }
75
-    
76
-    // destroy
77
-    public void destroy(){
78
-    	if (xxlJobLogCallbackServer!=null) {
79
-    		xxlJobLogCallbackServer.destroy();
80
-		}
81
-    }
82
-    
83
-    // xxlJobLogDao、xxlJobInfoDao
84
-    public static IXxlJobLogDao xxlJobLogDao;
85
-    public static IXxlJobInfoDao xxlJobInfoDao;
86
-    public static IXxlJobRegistryDao xxlJobRegistryDao;
87
-    public static IXxlJobGroupDao xxlJobGroupDao;
88
-
89
-    @Override
90
-	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
91
-		DynamicSchedulerUtil.xxlJobLogDao = applicationContext.getBean(IXxlJobLogDao.class);
92
-		DynamicSchedulerUtil.xxlJobInfoDao = applicationContext.getBean(IXxlJobInfoDao.class);
93
-        DynamicSchedulerUtil.xxlJobRegistryDao = applicationContext.getBean(IXxlJobRegistryDao.class);
94
-        DynamicSchedulerUtil.xxlJobGroupDao = applicationContext.getBean(IXxlJobGroupDao.class);
95
-	}
96
-    
97
-	@Override
98
-    public void afterPropertiesSet() throws Exception {
99
-        Assert.notNull(scheduler, "quartz scheduler is null");
100
-        logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler);
101
-       
102
-    }
103
-	
104
-	// getJobKeys
105
-	@Deprecated
106
-	public static List<Map<String, Object>> getJobList(){
107
-		List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
108
-		
109
-		try {
110
-			if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
111
-				return null;
112
-			}
113
-			String groupName = scheduler.getJobGroupNames().get(0);
114
-			Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
115
-			if (jobKeys!=null && jobKeys.size()>0) {
116
-				for (JobKey jobKey : jobKeys) {
117
-			        TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
118
-			        Trigger trigger = scheduler.getTrigger(triggerKey);
119
-			        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
120
-			        TriggerState triggerState = scheduler.getTriggerState(triggerKey);
121
-			        Map<String, Object> jobMap = new HashMap<String, Object>();
122
-			        jobMap.put("TriggerKey", triggerKey);
123
-			        jobMap.put("Trigger", trigger);
124
-			        jobMap.put("JobDetail", jobDetail);
125
-			        jobMap.put("TriggerState", triggerState);
126
-			        jobList.add(jobMap);
127
-				}
128
-			}
129
-			
130
-		} catch (SchedulerException e) {
131
-			e.printStackTrace();
132
-			return null;
133
-		}
134
-		return jobList;
135
-	}
136
-	
137
-	// fill job info
138
-	public static void fillJobInfo(XxlJobInfo jobInfo) {
139
-		// TriggerKey : name + group
140
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
141
-
142
-        try {
143
-			Trigger trigger = scheduler.getTrigger(triggerKey);
144
-
145
-			TriggerState triggerState = scheduler.getTriggerState(triggerKey);
146
-			
147
-			// parse params
148
-			if (trigger!=null && trigger instanceof CronTriggerImpl) {
149
-				String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
150
-				jobInfo.setJobCron(cronExpression);
151
-			}
152
-
153
-			//JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
154
-            //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
155
-            //String jobClass = jobDetail.getJobClass().getName();
156
-
157
-			if (triggerState!=null) {
158
-				jobInfo.setJobStatus(triggerState.name());
159
-			}
160
-			
161
-		} catch (SchedulerException e) {
162
-			e.printStackTrace();
163
-		}
164
-	}
165
-	
166
-	// check if exists
167
-	public static boolean checkExists(String jobName, String jobGroup) throws SchedulerException{
168
-		TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
169
-		return scheduler.checkExists(triggerKey);
170
-	}
171
-
172
-	// addJob 新增
173
-	@SuppressWarnings("unchecked")
174
-	public static boolean addJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
175
-    	// TriggerKey : name + group
176
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
177
-        JobKey jobKey = new JobKey(jobName, jobGroup);
178
-        
179
-        // TriggerKey valid if_exists
180
-        if (checkExists(jobName, jobGroup)) {
181
-            logger.info(">>>>>>>>> addJob fail, job already exist, jobGroup:{}, jobName:{}", jobGroup, jobName);
182
-            return false;
183
-        }
184
-        
185
-        // CronTrigger : TriggerKey + cronExpression	// withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
186
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
187
-        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
188
-
189
-        // JobDetail : jobClass
190
-		Class<? extends Job> jobClass_ = RemoteHttpJobBean.class;   // Class.forName(jobInfo.getJobClass());
191
-        
192
-		JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
193
-        /*if (jobInfo.getJobData()!=null) {
194
-        	JobDataMap jobDataMap = jobDetail.getJobDataMap();
195
-        	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));	
196
-        	// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
197
-		}*/
198
-        
199
-        // schedule : jobDetail + cronTrigger
200
-        Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
201
-
202
-        logger.info(">>>>>>>>>>> addJob success, jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
203
-        return true;
204
-    }
205
-    
206
-    // reschedule
207
-	public static boolean rescheduleJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
208
-    	
209
-    	// TriggerKey valid if_exists
210
-        if (!checkExists(jobName, jobGroup)) {
211
-        	logger.info(">>>>>>>>>>> rescheduleJob fail, job not exists, JobGroup:{}, JobName:{}", jobGroup, jobName);
212
-            return false;
213
-        }
214
-        
215
-        // TriggerKey : name + group
216
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
217
-        JobKey jobKey = new JobKey(jobName, jobGroup);
218
-        
219
-        // CronTrigger : TriggerKey + cronExpression
220
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
221
-        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
222
-        
223
-        //scheduler.rescheduleJob(triggerKey, cronTrigger);
224
-        
225
-        // JobDetail-JobDataMap fresh
226
-        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
227
-    	/*JobDataMap jobDataMap = jobDetail.getJobDataMap();
228
-    	jobDataMap.clear();
229
-    	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/
230
-    	
231
-    	// Trigger fresh
232
-    	HashSet<Trigger> triggerSet = new HashSet<Trigger>();
233
-    	triggerSet.add(cronTrigger);
234
-        
235
-        scheduler.scheduleJob(jobDetail, triggerSet, true);
236
-        logger.info(">>>>>>>>>>> resumeJob success, JobGroup:{}, JobName:{}", jobGroup, jobName);
237
-        return true;
238
-    }
239
-    
240
-    // unscheduleJob
241
-    public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException {
242
-    	// TriggerKey : name + group
243
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
244
-        boolean result = false;
245
-        if (checkExists(jobName, jobGroup)) {
246
-            result = scheduler.unscheduleJob(triggerKey);
247
-            logger.info(">>>>>>>>>>> removeJob, triggerKey:{}, result [{}]", triggerKey, result);
248
-        }
249
-        return true;
250
-    }
251
-
252
-    // Pause
253
-    public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException {
254
-    	// TriggerKey : name + group
255
-    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
256
-        
257
-        boolean result = false;
258
-        if (checkExists(jobName, jobGroup)) {
259
-            scheduler.pauseTrigger(triggerKey);
260
-            result = true;
261
-            logger.info(">>>>>>>>>>> pauseJob success, triggerKey:{}", triggerKey);
262
-        } else {
263
-        	logger.info(">>>>>>>>>>> pauseJob fail, triggerKey:{}", triggerKey);
264
-        }
265
-        return result;
266
-    }
267
-    
268
-    // resume
269
-    public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException {
270
-    	// TriggerKey : name + group
271
-    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
272
-        
273
-        boolean result = false;
274
-        if (checkExists(jobName, jobGroup)) {
275
-            scheduler.resumeTrigger(triggerKey);
276
-            result = true;
277
-            logger.info(">>>>>>>>>>> resumeJob success, triggerKey:{}", triggerKey);
278
-        } else {
279
-        	logger.info(">>>>>>>>>>> resumeJob fail, triggerKey:{}", triggerKey);
280
-        }
281
-        return result;
282
-    }
283
-    
284
-    // run
285
-    public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException {
286
-    	// TriggerKey : name + group
287
-    	JobKey jobKey = new JobKey(jobName, jobGroup);
288
-        
289
-        boolean result = false;
290
-        if (checkExists(jobName, jobGroup)) {
291
-            scheduler.triggerJob(jobKey);
292
-            result = true;
293
-            logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
294
-        } else {
295
-        	logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
296
-        }
297
-        return result;
298
-    }
299
-
300
-
1
+package com.xxl.job.admin.core.schedule;
2
+
3
+import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
4
+import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.thread.JobRegistryHelper;
6
+import com.xxl.job.admin.dao.IXxlJobGroupDao;
7
+import com.xxl.job.admin.dao.IXxlJobInfoDao;
8
+import com.xxl.job.admin.dao.IXxlJobLogDao;
9
+import com.xxl.job.admin.dao.IXxlJobRegistryDao;
10
+import com.xxl.job.core.biz.AdminBiz;
11
+import com.xxl.job.admin.core.biz.AdminBizImpl;
12
+import com.xxl.job.core.rpc.netcom.NetComServerFactory;
13
+import com.xxl.job.core.util.IpUtil;
14
+import org.quartz.*;
15
+import org.quartz.Trigger.TriggerState;
16
+import org.quartz.impl.matchers.GroupMatcher;
17
+import org.quartz.impl.triggers.CronTriggerImpl;
18
+import org.slf4j.Logger;
19
+import org.slf4j.LoggerFactory;
20
+import org.springframework.beans.BeansException;
21
+import org.springframework.beans.factory.InitializingBean;
22
+import org.springframework.context.ApplicationContext;
23
+import org.springframework.context.ApplicationContextAware;
24
+import org.springframework.util.Assert;
25
+
26
+import java.util.*;
27
+
28
+/**
29
+ * base quartz scheduler util
30
+ * @author xuxueli 2015-12-19 16:13:53
31
+ */
32
+public final class DynamicSchedulerUtil implements ApplicationContextAware, InitializingBean {
33
+    private static final Logger logger = LoggerFactory.getLogger(DynamicSchedulerUtil.class);
34
+    
35
+    // Scheduler
36
+    private static Scheduler scheduler;
37
+    public static void setScheduler(Scheduler scheduler) {
38
+		DynamicSchedulerUtil.scheduler = scheduler;
39
+	}
40
+    
41
+    // trigger callback address
42
+    private String callBackIp;
43
+    private int callBackPort = 8888;
44
+    private static String callbackAddress;
45
+
46
+    public void setCallBackIp(String callBackIp) {
47
+        this.callBackIp = callBackIp;
48
+    }
49
+    public void setCallBackPort(int callBackPort) {
50
+		this.callBackPort = callBackPort;
51
+	}
52
+    public static String getCallbackAddress(){
53
+        return callbackAddress;
54
+    }
55
+
56
+    // init
57
+    private NetComServerFactory serverFactory = new NetComServerFactory();
58
+    public void init() throws Exception {
59
+        // server
60
+        NetComServerFactory.putService(AdminBiz.class, new AdminBizImpl());
61
+        serverFactory.start(callBackPort, callBackIp, null, null);
62
+
63
+		// init callbackAddress
64
+        if (callBackIp!=null && callBackIp.trim().length()>0) {
65
+            callbackAddress = callBackIp.trim().concat(":").concat(String.valueOf(callBackPort));
66
+        } else {
67
+            callbackAddress = IpUtil.getIpPort(callBackPort);;
68
+        }
69
+
70
+		// init JobRegistryHelper
71
+        JobRegistryHelper.discover("g", "k");
72
+    }
73
+    
74
+    // destroy
75
+    public void destroy(){
76
+        serverFactory.destroy();
77
+    }
78
+    
79
+    // xxlJobLogDao、xxlJobInfoDao
80
+    public static IXxlJobLogDao xxlJobLogDao;
81
+    public static IXxlJobInfoDao xxlJobInfoDao;
82
+    public static IXxlJobRegistryDao xxlJobRegistryDao;
83
+    public static IXxlJobGroupDao xxlJobGroupDao;
84
+
85
+    @Override
86
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
87
+		DynamicSchedulerUtil.xxlJobLogDao = applicationContext.getBean(IXxlJobLogDao.class);
88
+		DynamicSchedulerUtil.xxlJobInfoDao = applicationContext.getBean(IXxlJobInfoDao.class);
89
+        DynamicSchedulerUtil.xxlJobRegistryDao = applicationContext.getBean(IXxlJobRegistryDao.class);
90
+        DynamicSchedulerUtil.xxlJobGroupDao = applicationContext.getBean(IXxlJobGroupDao.class);
91
+	}
92
+    
93
+	@Override
94
+    public void afterPropertiesSet() throws Exception {
95
+        Assert.notNull(scheduler, "quartz scheduler is null");
96
+        logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler);
97
+       
98
+    }
99
+	
100
+	// getJobKeys
101
+	@Deprecated
102
+	public static List<Map<String, Object>> getJobList(){
103
+		List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
104
+		
105
+		try {
106
+			if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
107
+				return null;
108
+			}
109
+			String groupName = scheduler.getJobGroupNames().get(0);
110
+			Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
111
+			if (jobKeys!=null && jobKeys.size()>0) {
112
+				for (JobKey jobKey : jobKeys) {
113
+			        TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
114
+			        Trigger trigger = scheduler.getTrigger(triggerKey);
115
+			        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
116
+			        TriggerState triggerState = scheduler.getTriggerState(triggerKey);
117
+			        Map<String, Object> jobMap = new HashMap<String, Object>();
118
+			        jobMap.put("TriggerKey", triggerKey);
119
+			        jobMap.put("Trigger", trigger);
120
+			        jobMap.put("JobDetail", jobDetail);
121
+			        jobMap.put("TriggerState", triggerState);
122
+			        jobList.add(jobMap);
123
+				}
124
+			}
125
+			
126
+		} catch (SchedulerException e) {
127
+			e.printStackTrace();
128
+			return null;
129
+		}
130
+		return jobList;
131
+	}
132
+	
133
+	// fill job info
134
+	public static void fillJobInfo(XxlJobInfo jobInfo) {
135
+		// TriggerKey : name + group
136
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
137
+
138
+        try {
139
+			Trigger trigger = scheduler.getTrigger(triggerKey);
140
+
141
+			TriggerState triggerState = scheduler.getTriggerState(triggerKey);
142
+			
143
+			// parse params
144
+			if (trigger!=null && trigger instanceof CronTriggerImpl) {
145
+				String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
146
+				jobInfo.setJobCron(cronExpression);
147
+			}
148
+
149
+			//JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
150
+            //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
151
+            //String jobClass = jobDetail.getJobClass().getName();
152
+
153
+			if (triggerState!=null) {
154
+				jobInfo.setJobStatus(triggerState.name());
155
+			}
156
+			
157
+		} catch (SchedulerException e) {
158
+			e.printStackTrace();
159
+		}
160
+	}
161
+	
162
+	// check if exists
163
+	public static boolean checkExists(String jobName, String jobGroup) throws SchedulerException{
164
+		TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
165
+		return scheduler.checkExists(triggerKey);
166
+	}
167
+
168
+	// addJob 新增
169
+	@SuppressWarnings("unchecked")
170
+	public static boolean addJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
171
+    	// TriggerKey : name + group
172
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
173
+        JobKey jobKey = new JobKey(jobName, jobGroup);
174
+        
175
+        // TriggerKey valid if_exists
176
+        if (checkExists(jobName, jobGroup)) {
177
+            logger.info(">>>>>>>>> addJob fail, job already exist, jobGroup:{}, jobName:{}", jobGroup, jobName);
178
+            return false;
179
+        }
180
+        
181
+        // CronTrigger : TriggerKey + cronExpression	// withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
182
+        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
183
+        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
184
+
185
+        // JobDetail : jobClass
186
+		Class<? extends Job> jobClass_ = RemoteHttpJobBean.class;   // Class.forName(jobInfo.getJobClass());
187
+        
188
+		JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
189
+        /*if (jobInfo.getJobData()!=null) {
190
+        	JobDataMap jobDataMap = jobDetail.getJobDataMap();
191
+        	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));	
192
+        	// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
193
+		}*/
194
+        
195
+        // schedule : jobDetail + cronTrigger
196
+        Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
197
+
198
+        logger.info(">>>>>>>>>>> addJob success, jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
199
+        return true;
200
+    }
201
+    
202
+    // reschedule
203
+	public static boolean rescheduleJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
204
+    	
205
+    	// TriggerKey valid if_exists
206
+        if (!checkExists(jobName, jobGroup)) {
207
+        	logger.info(">>>>>>>>>>> rescheduleJob fail, job not exists, JobGroup:{}, JobName:{}", jobGroup, jobName);
208
+            return false;
209
+        }
210
+        
211
+        // TriggerKey : name + group
212
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
213
+        JobKey jobKey = new JobKey(jobName, jobGroup);
214
+        
215
+        // CronTrigger : TriggerKey + cronExpression
216
+        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
217
+        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
218
+        
219
+        //scheduler.rescheduleJob(triggerKey, cronTrigger);
220
+        
221
+        // JobDetail-JobDataMap fresh
222
+        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
223
+    	/*JobDataMap jobDataMap = jobDetail.getJobDataMap();
224
+    	jobDataMap.clear();
225
+    	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));*/
226
+    	
227
+    	// Trigger fresh
228
+    	HashSet<Trigger> triggerSet = new HashSet<Trigger>();
229
+    	triggerSet.add(cronTrigger);
230
+        
231
+        scheduler.scheduleJob(jobDetail, triggerSet, true);
232
+        logger.info(">>>>>>>>>>> resumeJob success, JobGroup:{}, JobName:{}", jobGroup, jobName);
233
+        return true;
234
+    }
235
+    
236
+    // unscheduleJob
237
+    public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException {
238
+    	// TriggerKey : name + group
239
+        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
240
+        boolean result = false;
241
+        if (checkExists(jobName, jobGroup)) {
242
+            result = scheduler.unscheduleJob(triggerKey);
243
+            logger.info(">>>>>>>>>>> removeJob, triggerKey:{}, result [{}]", triggerKey, result);
244
+        }
245
+        return true;
246
+    }
247
+
248
+    // Pause
249
+    public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException {
250
+    	// TriggerKey : name + group
251
+    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
252
+        
253
+        boolean result = false;
254
+        if (checkExists(jobName, jobGroup)) {
255
+            scheduler.pauseTrigger(triggerKey);
256
+            result = true;
257
+            logger.info(">>>>>>>>>>> pauseJob success, triggerKey:{}", triggerKey);
258
+        } else {
259
+        	logger.info(">>>>>>>>>>> pauseJob fail, triggerKey:{}", triggerKey);
260
+        }
261
+        return result;
262
+    }
263
+    
264
+    // resume
265
+    public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException {
266
+    	// TriggerKey : name + group
267
+    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
268
+        
269
+        boolean result = false;
270
+        if (checkExists(jobName, jobGroup)) {
271
+            scheduler.resumeTrigger(triggerKey);
272
+            result = true;
273
+            logger.info(">>>>>>>>>>> resumeJob success, triggerKey:{}", triggerKey);
274
+        } else {
275
+        	logger.info(">>>>>>>>>>> resumeJob fail, triggerKey:{}", triggerKey);
276
+        }
277
+        return result;
278
+    }
279
+    
280
+    // run
281
+    public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException {
282
+    	// TriggerKey : name + group
283
+    	JobKey jobKey = new JobKey(jobName, jobGroup);
284
+        
285
+        boolean result = false;
286
+        if (checkExists(jobName, jobGroup)) {
287
+            scheduler.triggerJob(jobKey);
288
+            result = true;
289
+            logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
290
+        } else {
291
+        	logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
292
+        }
293
+        return result;
294
+    }
295
+
296
+
301 297
 }

+ 5 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobMonitorHelper.java Vedi File

@@ -3,9 +3,9 @@ package com.xxl.job.admin.core.thread;
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.model.XxlJobLog;
6
-import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
6
+import com.xxl.job.admin.core.schedule.DynamicSchedulerUtil;
7 7
 import com.xxl.job.admin.core.util.MailUtil;
8
-import com.xxl.job.core.router.model.ResponseModel;
8
+import com.xxl.job.core.biz.model.ReturnT;
9 9
 import org.apache.commons.lang.StringUtils;
10 10
 import org.slf4j.Logger;
11 11
 import org.slf4j.LoggerFactory;
@@ -41,7 +41,7 @@ public class JobMonitorHelper {
41 41
 							logger.info(">>>>>>>>>>> job monitor heat success, JobLogId:{}", jobLogId);
42 42
 							XxlJobLog log = DynamicSchedulerUtil.xxlJobLogDao.load(jobLogId);
43 43
 							if (log!=null) {
44
-								if (ResponseModel.SUCCESS.equals(log.getTriggerStatus()) && StringUtils.isBlank(log.getHandleStatus())) {
44
+								if ((ReturnT.SUCCESS_CODE+"").equals(log.getTriggerStatus()) && StringUtils.isBlank(log.getHandleStatus())) {
45 45
 									try {
46 46
 										TimeUnit.SECONDS.sleep(10);
47 47
 									} catch (InterruptedException e) {
@@ -49,10 +49,10 @@ public class JobMonitorHelper {
49 49
 									}
50 50
 									JobMonitorHelper.monitor(jobLogId);
51 51
 								}
52
-								if (ResponseModel.SUCCESS.equals(log.getTriggerStatus()) && ResponseModel.SUCCESS.equals(log.getHandleStatus())) {
52
+								if ((ReturnT.SUCCESS_CODE+"").equals(log.getTriggerStatus()) && (ReturnT.SUCCESS_CODE+"").equals(log.getHandleStatus())) {
53 53
 									// pass
54 54
 								}
55
-								if (ResponseModel.FAIL.equals(log.getTriggerStatus()) || ResponseModel.FAIL.equals(log.getHandleStatus())) {
55
+								if ((ReturnT.FAIL+"").equals(log.getTriggerStatus()) || (ReturnT.FAIL+"").equals(log.getHandleStatus())) {
56 56
 									XxlJobInfo info = DynamicSchedulerUtil.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
57 57
 									if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
58 58
 

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java Vedi File

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.thread;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobRegistry;
4
-import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
4
+import com.xxl.job.admin.core.schedule.DynamicSchedulerUtil;
5 5
 import com.xxl.job.core.registry.RegistHelper;
6 6
 import org.slf4j.Logger;
7 7
 import org.slf4j.LoggerFactory;

+ 0 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java Vedi File

@@ -38,12 +38,10 @@ public class CookieUtil {
38 38
 
39 39
 	/**
40 40
 	 * 保存
41
-	 * @param request
42 41
 	 * @param response
43 42
 	 * @param key
44 43
 	 * @param value
45 44
 	 * @param maxAge
46
-	 * @param domain
47 45
 	 */
48 46
 	private static void set(HttpServletResponse response, 
49 47
 			String key, String value, int maxAge, String path) {

xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java → xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java Vedi File

@@ -1,93 +1,93 @@
1
-package com.xxl.job.core.util;
2
-
3
-
4
-import org.codehaus.jackson.JsonGenerationException;
5
-import org.codehaus.jackson.JsonParseException;
6
-import org.codehaus.jackson.map.JsonMappingException;
7
-import org.codehaus.jackson.map.ObjectMapper;
8
-import org.codehaus.jackson.type.TypeReference;
9
-
10
-import java.io.IOException;
11
-import java.util.HashMap;
12
-import java.util.Map;
13
-
14
-/**
15
- * Jackson util
16
- * 
17
- * 1、obj need private and set/get;
18
- * 2、do not support inner class;
19
- * 
20
- * @author xuxueli 2015-9-25 18:02:56
21
- */
22
-public class JacksonUtil {
23
-    private final static ObjectMapper objectMapper = new ObjectMapper();
24
-    public static ObjectMapper getInstance() {
25
-        return objectMapper;
26
-    }
27
-
28
-    /**
29
-     * bean、array、List、Map --> json
30
-     * 
31
-     * @param obj
32
-     * @return json string
33
-     * @throws Exception
34
-     */
35
-    public static String writeValueAsString(Object obj) {
36
-    	try {
37
-			return getInstance().writeValueAsString(obj);
38
-		} catch (JsonGenerationException e) {
39
-			e.printStackTrace();
40
-		} catch (JsonMappingException e) {
41
-			e.printStackTrace();
42
-		} catch (IOException e) {
43
-			e.printStackTrace();
44
-		}
45
-        return null;
46
-    }
47
-
48
-    /**
49
-     * string --> bean、Map、List(array)
50
-     * 
51
-     * @param jsonStr
52
-     * @param clazz
53
-     * @return obj
54
-     * @throws Exception
55
-     */
56
-    public static <T> T readValue(String jsonStr, Class<T> clazz) {
57
-    	try {
58
-			return getInstance().readValue(jsonStr, clazz);
59
-		} catch (JsonParseException e) {
60
-			e.printStackTrace();
61
-		} catch (JsonMappingException e) {
62
-			e.printStackTrace();
63
-		} catch (IOException e) {
64
-			e.printStackTrace();
65
-		}
66
-    	return null;
67
-    }
68
-    public static <T> T readValueRefer(String jsonStr, Class<T> clazz) {
69
-    	try {
70
-			return getInstance().readValue(jsonStr, new TypeReference<T>() { });
71
-		} catch (JsonParseException e) {
72
-			e.printStackTrace();
73
-		} catch (JsonMappingException e) {
74
-			e.printStackTrace();
75
-		} catch (IOException e) {
76
-			e.printStackTrace();
77
-		}
78
-    	return null;
79
-    }
80
-
81
-    public static void main(String[] args) {
82
-		try {
83
-			Map<String, String> map = new HashMap<String, String>();
84
-			map.put("aaa", "111");
85
-			map.put("bbb", "222");
86
-			String json = writeValueAsString(map);
87
-			System.out.println(json);
88
-			System.out.println(readValue(json, Map.class));
89
-		} catch (Exception e) {
90
-			e.printStackTrace();
91
-		}
92
-	}
93
-}
1
+package com.xxl.job.admin.core.util;
2
+
3
+
4
+import org.codehaus.jackson.JsonGenerationException;
5
+import org.codehaus.jackson.JsonParseException;
6
+import org.codehaus.jackson.map.JsonMappingException;
7
+import org.codehaus.jackson.map.ObjectMapper;
8
+import org.codehaus.jackson.type.TypeReference;
9
+
10
+import java.io.IOException;
11
+import java.util.HashMap;
12
+import java.util.Map;
13
+
14
+/**
15
+ * Jackson util
16
+ * 
17
+ * 1、obj need private and set/get;
18
+ * 2、do not support inner class;
19
+ * 
20
+ * @author xuxueli 2015-9-25 18:02:56
21
+ */
22
+public class JacksonUtil {
23
+    private final static ObjectMapper objectMapper = new ObjectMapper();
24
+    public static ObjectMapper getInstance() {
25
+        return objectMapper;
26
+    }
27
+
28
+    /**
29
+     * bean、array、List、Map --> json
30
+     * 
31
+     * @param obj
32
+     * @return json string
33
+     * @throws Exception
34
+     */
35
+    public static String writeValueAsString(Object obj) {
36
+    	try {
37
+			return getInstance().writeValueAsString(obj);
38
+		} catch (JsonGenerationException e) {
39
+			e.printStackTrace();
40
+		} catch (JsonMappingException e) {
41
+			e.printStackTrace();
42
+		} catch (IOException e) {
43
+			e.printStackTrace();
44
+		}
45
+        return null;
46
+    }
47
+
48
+    /**
49
+     * string --> bean、Map、List(array)
50
+     * 
51
+     * @param jsonStr
52
+     * @param clazz
53
+     * @return obj
54
+     * @throws Exception
55
+     */
56
+    public static <T> T readValue(String jsonStr, Class<T> clazz) {
57
+    	try {
58
+			return getInstance().readValue(jsonStr, clazz);
59
+		} catch (JsonParseException e) {
60
+			e.printStackTrace();
61
+		} catch (JsonMappingException e) {
62
+			e.printStackTrace();
63
+		} catch (IOException e) {
64
+			e.printStackTrace();
65
+		}
66
+    	return null;
67
+    }
68
+    public static <T> T readValueRefer(String jsonStr, Class<T> clazz) {
69
+    	try {
70
+			return getInstance().readValue(jsonStr, new TypeReference<T>() { });
71
+		} catch (JsonParseException e) {
72
+			e.printStackTrace();
73
+		} catch (JsonMappingException e) {
74
+			e.printStackTrace();
75
+		} catch (IOException e) {
76
+			e.printStackTrace();
77
+		}
78
+    	return null;
79
+    }
80
+
81
+    public static void main(String[] args) {
82
+		try {
83
+			Map<String, String> map = new HashMap<String, String>();
84
+			map.put("aaa", "111");
85
+			map.put("bbb", "222");
86
+			String json = writeValueAsString(map);
87
+			System.out.println(json);
88
+			System.out.println(readValue(json, Map.class));
89
+		} catch (Exception e) {
90
+			e.printStackTrace();
91
+		}
92
+	}
93
+}

+ 5 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java Vedi File

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.service;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
3
+
4
+import com.xxl.job.core.biz.model.ReturnT;
4 5
 
5 6
 import java.util.Map;
6 7
 
@@ -13,9 +14,9 @@ public interface IXxlJobService {
13 14
 	
14 15
 	public Map<String, Object> pageList(int start, int length, int jobGroup, String executorHandler, String filterTime);
15 16
 	
16
-	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
17
-			String executorAddress,	String executorHandler, String executorParam,
18
-			int glueSwitch, String glueSource, String glueRemark, String childJobKey);
17
+	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
18
+							   String executorAddress, String executorHandler, String executorParam,
19
+							   int glueSwitch, String glueSource, String glueRemark, String childJobKey);
19 20
 	
20 21
 	public ReturnT<String> reschedule(int jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
21 22
 			String executorAddress, String executorHandler, String executorParam, int glueSwitch, String childJobKey);

+ 5 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Vedi File

@@ -1,14 +1,14 @@
1 1
 package com.xxl.job.admin.service.impl;
2 2
 
3
-import com.xxl.job.admin.core.model.ReturnT;
4 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
-import com.xxl.job.admin.core.util.DynamicSchedulerUtil;
5
+import com.xxl.job.admin.core.schedule.DynamicSchedulerUtil;
7 6
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
8 7
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
9 8
 import com.xxl.job.admin.dao.IXxlJobLogDao;
10 9
 import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
11 10
 import com.xxl.job.admin.service.IXxlJobService;
11
+import com.xxl.job.core.biz.model.ReturnT;
12 12
 import org.apache.commons.lang.StringUtils;
13 13
 import org.apache.commons.lang.time.FastDateFormat;
14 14
 import org.quartz.CronExpression;
@@ -64,9 +64,9 @@ public class XxlJobServiceImpl implements IXxlJobService {
64 64
 	}
65 65
 
66 66
 	@Override
67
-	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc,String author, String alarmEmail,
68
-			String executorAddress,	String executorHandler, String executorParam,
69
-			int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
67
+	public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
68
+							   String executorAddress, String executorHandler, String executorParam,
69
+							   int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
70 70
 		// valid
71 71
 		XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
72 72
 		if (group == null) {

+ 1 - 1
xxl-job-admin/src/main/resources/applicationcontext-xxl-job.xml Vedi File

@@ -14,7 +14,7 @@
14 14
 	</bean>
15 15
 	
16 16
 	<!-- 协同-调度器 -->
17
-	<bean id="dynamicSchedulerUtil" class="com.xxl.job.admin.core.util.DynamicSchedulerUtil" init-method="init" destroy-method="destroy" >
17
+	<bean id="dynamicSchedulerUtil" class="com.xxl.job.admin.core.schedule.DynamicSchedulerUtil" init-method="init" destroy-method="destroy" >
18 18
 		<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
19 19
         <property name="scheduler" ref="quartzScheduler"/>
20 20
 		<!-- 调度中心回调IP[选填],为空则自动获取 -->

+ 0 - 61
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java Vedi File

@@ -1,61 +0,0 @@
1
-package com.xxl.job.dao.impl;
2
-
3
-import com.xxl.job.admin.core.model.XxlJobLog;
4
-import com.xxl.job.admin.dao.IXxlJobLogDao;
5
-import com.xxl.job.core.router.model.ResponseModel;
6
-import org.junit.Test;
7
-import org.junit.runner.RunWith;
8
-import org.springframework.test.context.ContextConfiguration;
9
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10
-
11
-import javax.annotation.Resource;
12
-import java.util.Date;
13
-import java.util.List;
14
-
15
-@RunWith(SpringJUnit4ClassRunner.class)
16
-@ContextConfiguration(locations = "classpath*:applicationcontext-*.xml")
17
-public class XxlJobLogTest {
18
-	
19
-	@Resource
20
-	private IXxlJobLogDao xxlJobLogDao;
21
-	
22
-	@Test
23
-	public void save_load(){
24
-		XxlJobLog xxlJobLog = new XxlJobLog();
25
-		xxlJobLog.setJobName("job_name");
26
-		int count = xxlJobLogDao.save(xxlJobLog);
27
-		System.out.println(count);
28
-		System.out.println(xxlJobLog.getId());
29
-		
30
-		XxlJobLog item = xxlJobLogDao.load(xxlJobLog.getId());
31
-		System.out.println(item);
32
-	}
33
-	
34
-	@Test
35
-	public void updateTriggerInfo(){
36
-		XxlJobLog xxlJobLog = xxlJobLogDao.load(29);
37
-		xxlJobLog.setTriggerTime(new Date());
38
-		xxlJobLog.setTriggerStatus(ResponseModel.SUCCESS);
39
-		xxlJobLog.setTriggerMsg("trigger msg");
40
-		xxlJobLogDao.updateTriggerInfo(xxlJobLog);
41
-	}
42
-	
43
-	@Test
44
-	public void updateHandleInfo(){
45
-		XxlJobLog xxlJobLog = xxlJobLogDao.load(29);
46
-		xxlJobLog.setHandleTime(new Date());
47
-		xxlJobLog.setHandleStatus(ResponseModel.SUCCESS);
48
-		xxlJobLog.setHandleMsg("handle msg");
49
-		xxlJobLogDao.updateHandleInfo(xxlJobLog);
50
-	}
51
-	
52
-	@Test
53
-	public void pageList(){
54
-		List<XxlJobLog> list = xxlJobLogDao.pageList(0, 20, 0, null, null, null);
55
-		int list_count = xxlJobLogDao.pageListCount(0, 20, 0, null, null, null);
56
-		
57
-		System.out.println(list);
58
-		System.out.println(list_count);
59
-	}
60
-	
61
-}

+ 8 - 1
xxl-job-core/pom.xml Vedi File

@@ -4,7 +4,7 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.6.0</version>
7
+		<version>1.6.0-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-core</artifactId>
10 10
 	<packaging>jar</packaging>
@@ -40,6 +40,13 @@
40 40
 			<version>1.7.5</version>
41 41
 		</dependency>
42 42
 
43
+		<!-- hessian -->
44
+		<dependency>
45
+			<groupId>com.caucho</groupId>
46
+			<artifactId>hessian</artifactId>
47
+			<version>4.0.38</version>
48
+		</dependency>
49
+
43 50
 		<!-- jackson -->
44 51
 		<dependency>
45 52
 			<groupId>org.codehaus.jackson</groupId>

+ 13 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java Vedi File

@@ -0,0 +1,13 @@
1
+package com.xxl.job.core.biz;
2
+
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.job.core.biz.model.TriggerParam;
5
+
6
+/**
7
+ * Created by xuxueli on 17/3/1.
8
+ */
9
+public interface AdminBiz {
10
+
11
+    public ReturnT<String> callback(TriggerParam triggerParam);
12
+
13
+}

+ 40 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/ExecutorBiz.java Vedi File

@@ -0,0 +1,40 @@
1
+package com.xxl.job.core.biz;
2
+
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.job.core.biz.model.TriggerParam;
5
+
6
+/**
7
+ * Created by xuxueli on 17/3/1.
8
+ */
9
+public interface ExecutorBiz {
10
+
11
+    /**
12
+     * beat
13
+     * @return
14
+     */
15
+    public ReturnT<String> beat();
16
+
17
+    /**
18
+     * kill
19
+     * @param jobGroup
20
+     * @param jobName
21
+     * @return
22
+     */
23
+    public ReturnT<String> kill(String jobGroup, String jobName);
24
+
25
+    /**
26
+     * log
27
+     * @param logDateTim
28
+     * @param logId
29
+     * @return
30
+     */
31
+    public ReturnT<String> log(long logDateTim, int logId);
32
+
33
+    /**
34
+     * run
35
+     * @param triggerParam
36
+     * @return
37
+     */
38
+    public ReturnT<String> run(TriggerParam triggerParam);
39
+
40
+}

+ 112 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java Vedi File

@@ -0,0 +1,112 @@
1
+package com.xxl.job.core.biz.impl;
2
+
3
+import com.xxl.job.core.biz.ExecutorBiz;
4
+import com.xxl.job.core.biz.model.ReturnT;
5
+import com.xxl.job.core.biz.model.TriggerParam;
6
+import com.xxl.job.core.executor.XxlJobExecutor;
7
+import com.xxl.job.core.glue.GlueFactory;
8
+import com.xxl.job.core.handler.IJobHandler;
9
+import com.xxl.job.core.handler.impl.GlueJobHandler;
10
+import com.xxl.job.core.log.XxlJobFileAppender;
11
+import com.xxl.job.core.thread.JobThread;
12
+
13
+import java.util.Date;
14
+
15
+/**
16
+ * Created by xuxueli on 17/3/1.
17
+ */
18
+public class ExecutorBizImpl implements ExecutorBiz {
19
+
20
+    @Override
21
+    public ReturnT<String> beat() {
22
+        return ReturnT.SUCCESS;
23
+    }
24
+
25
+    @Override
26
+    public ReturnT<String> kill(String jobGroup, String jobName) {
27
+
28
+        // generate jobKey
29
+        String jobKey = jobGroup.concat("_").concat(jobName);
30
+
31
+        // kill handlerThread, and create new one
32
+        JobThread jobThread = XxlJobExecutor.loadJobThread(jobKey);
33
+
34
+        if (jobThread != null) {
35
+            IJobHandler handler = jobThread.getHandler();
36
+            jobThread.toStop("人工手动终止");
37
+            jobThread.interrupt();
38
+            //XxlJobExecutor.registJobThread(jobKey, handler);
39
+            return ReturnT.SUCCESS;
40
+        }
41
+
42
+        return new ReturnT<String>(ReturnT.FAIL_CODE, "job thread not found.");
43
+    }
44
+
45
+    @Override
46
+    public ReturnT<String> log(long logDateTim, int logId) {
47
+        // log filename: yyyy-MM-dd/9999.log
48
+        String logFileName = XxlJobFileAppender.makeLogFileName(new Date(logDateTim), logId);
49
+
50
+        String logConteng = XxlJobFileAppender.readLog(logFileName);
51
+        return new ReturnT<String>(ReturnT.SUCCESS_CODE, logConteng);
52
+    }
53
+
54
+    @Override
55
+    public ReturnT<String> run(TriggerParam triggerParam) {
56
+        // generate jobKey
57
+        String jobKey = triggerParam.getJobGroup().concat("_").concat(triggerParam.getJobName());
58
+
59
+        // load old thread
60
+        JobThread jobThread = XxlJobExecutor.loadJobThread(jobKey);
61
+
62
+        if (!triggerParam.isGlueSwitch()) {
63
+            // bean model
64
+
65
+            // valid handler instance
66
+            IJobHandler jobHandler = XxlJobExecutor.loadJobHandler(triggerParam.getExecutorHandler());
67
+            if (jobHandler==null) {
68
+                return new ReturnT(ReturnT.FAIL_CODE, "job handler for jobKey=[" + jobKey + "] not found.");
69
+            }
70
+
71
+            if (jobThread == null) {
72
+                jobThread = XxlJobExecutor.registJobThread(jobKey, jobHandler);
73
+            } else {
74
+                // job handler update, kill old job thread
75
+                if (jobThread.getHandler() != jobHandler) {
76
+                    // kill old job thread
77
+                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
78
+                    jobThread.interrupt();
79
+
80
+                    // new thread, with new job handler
81
+                    jobThread = XxlJobExecutor.registJobThread(jobKey, jobHandler);
82
+                }
83
+            }
84
+        } else {
85
+            // glue model
86
+
87
+            // valid glueloader
88
+            if (!GlueFactory.isActive()) {
89
+                return new ReturnT(ReturnT.FAIL_CODE, "glueLoader for jobKey=[" + jobKey + "] not found.");
90
+            }
91
+
92
+            if (jobThread == null) {
93
+                jobThread = XxlJobExecutor.registJobThread(jobKey, new GlueJobHandler(triggerParam.getJobGroup(), triggerParam.getJobName()));
94
+            } else {
95
+                // job handler update, kill old job thread
96
+                if (!(jobThread.getHandler() instanceof GlueJobHandler)) {
97
+                    // kill old job thread
98
+                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
99
+                    jobThread.interrupt();
100
+
101
+                    // new thread, with new job handler
102
+                    jobThread = XxlJobExecutor.registJobThread(jobKey, new GlueJobHandler(triggerParam.getJobGroup(), triggerParam.getJobName()));
103
+                }
104
+            }
105
+        }
106
+
107
+        // push data to queue
108
+        jobThread.pushTriggerQueue(triggerParam);
109
+        return ReturnT.SUCCESS;
110
+    }
111
+
112
+}

xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/ReturnT.java → xxl-job-core/src/main/java/com/xxl/job/core/biz/model/ReturnT.java Vedi File

@@ -1,50 +1,55 @@
1
-package com.xxl.job.admin.core.model;
2
-
3
-/**
4
- * common return
5
- * @author xuxueli 2015-12-4 16:32:31
6
- * @param <T>
7
- */
8
-public class ReturnT<T> {
9
-	public static final ReturnT<String> SUCCESS = new ReturnT<String>(null);
10
-	public static final ReturnT<String> FAIL = new ReturnT<String>(500, null);
11
-	
12
-	private int code;
13
-	private String msg;
14
-	private T content;
15
-	
16
-	public ReturnT(int code, String msg) {
17
-		this.code = code;
18
-		this.msg = msg;
19
-	}
20
-	public ReturnT(T content) {
21
-		this.code = 200;
22
-		this.content = content;
23
-	}
24
-	
25
-	public int getCode() {
26
-		return code;
27
-	}
28
-	public void setCode(int code) {
29
-		this.code = code;
30
-	}
31
-	public String getMsg() {
32
-		return msg;
33
-	}
34
-	public void setMsg(String msg) {
35
-		this.msg = msg;
36
-	}
37
-	public T getContent() {
38
-		return content;
39
-	}
40
-	public void setContent(T content) {
41
-		this.content = content;
42
-	}
43
-
44
-	@Override
45
-	public String toString() {
46
-		return "ReturnT [code=" + code + ", msg=" + msg + ", content="
47
-				+ content + "]";
48
-	}
49
-
50
-}
1
+package com.xxl.job.core.biz.model;
2
+
3
+import java.io.Serializable;
4
+
5
+/**
6
+ * common return
7
+ * @author xuxueli 2015-12-4 16:32:31
8
+ * @param <T>
9
+ */
10
+public class ReturnT<T> implements Serializable {
11
+	public static final long serialVersionUID = 42L;
12
+
13
+	public static final int SUCCESS_CODE = 200;
14
+	public static final int FAIL_CODE = 500;
15
+	public static final ReturnT<String> SUCCESS = new ReturnT<String>(null);
16
+	public static final ReturnT<String> FAIL = new ReturnT<String>(FAIL_CODE, null);
17
+	
18
+	private int code;
19
+	private String msg;
20
+	private T content;
21
+	
22
+	public ReturnT(int code, String msg) {
23
+		this.code = code;
24
+		this.msg = msg;
25
+	}
26
+	public ReturnT(T content) {
27
+		this.code = SUCCESS_CODE;
28
+		this.content = content;
29
+	}
30
+	
31
+	public int getCode() {
32
+		return code;
33
+	}
34
+	public void setCode(int code) {
35
+		this.code = code;
36
+	}
37
+	public String getMsg() {
38
+		return msg;
39
+	}
40
+	public void setMsg(String msg) {
41
+		this.msg = msg;
42
+	}
43
+	public T getContent() {
44
+		return content;
45
+	}
46
+	public void setContent(T content) {
47
+		this.content = content;
48
+	}
49
+
50
+	@Override
51
+	public String toString() {
52
+		return "ReturnT [code=" + code + ", msg=" + msg + ", content=" + content + "]";
53
+	}
54
+
55
+}

xxl-job-core/src/main/java/com/xxl/job/core/router/model/RequestModel.java → xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java Vedi File

@@ -1,13 +1,14 @@
1
-package com.xxl.job.core.router.model;
1
+package com.xxl.job.core.biz.model;
2 2
 
3
+import java.io.Serializable;
3 4
 import java.util.Set;
4 5
 
5 6
 /**
6 7
  * Created by xuxueli on 16/7/22.
7 8
  */
8
-public class RequestModel {
9
+public class TriggerParam implements Serializable{
10
+    private static final long serialVersionUID = 42L;
9 11
 
10
-    private long timestamp;
11 12
     private String action;
12 13
 
13 14
     private String jobGroup;
@@ -25,15 +26,6 @@ public class RequestModel {
25 26
     private String status;
26 27
     private String msg;
27 28
 
28
-
29
-    public long getTimestamp() {
30
-        return timestamp;
31
-    }
32
-
33
-    public void setTimestamp(long timestamp) {
34
-        this.timestamp = timestamp;
35
-    }
36
-
37 29
     public String getAction() {
38 30
         return action;
39 31
     }
@@ -125,7 +117,6 @@ public class RequestModel {
125 117
     @Override
126 118
     public String toString() {
127 119
         return "RequestModel{" +
128
-                "timestamp=" + timestamp +
129 120
                 ", action='" + action + '\'' +
130 121
                 ", jobGroup='" + jobGroup + '\'' +
131 122
                 ", jobName='" + jobName + '\'' +

+ 105 - 0
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java Vedi File

@@ -0,0 +1,105 @@
1
+package com.xxl.job.core.executor;
2
+
3
+import com.xxl.job.core.biz.ExecutorBiz;
4
+import com.xxl.job.core.biz.impl.ExecutorBizImpl;
5
+import com.xxl.job.core.handler.IJobHandler;
6
+import com.xxl.job.core.handler.annotation.JobHander;
7
+import com.xxl.job.core.registry.RegistHelper;
8
+import com.xxl.job.core.rpc.netcom.NetComServerFactory;
9
+import com.xxl.job.core.thread.JobThread;
10
+import org.slf4j.Logger;
11
+import org.slf4j.LoggerFactory;
12
+import org.springframework.beans.BeansException;
13
+import org.springframework.context.ApplicationContext;
14
+import org.springframework.context.ApplicationContextAware;
15
+import org.springframework.context.ApplicationEvent;
16
+import org.springframework.context.ApplicationListener;
17
+import org.springframework.context.event.ContextClosedEvent;
18
+
19
+import java.util.Map;
20
+import java.util.concurrent.ConcurrentHashMap;
21
+
22
+/**
23
+ * Created by xuxueli on 2016/3/2 21:14.
24
+ */
25
+public class XxlJobExecutor implements ApplicationContextAware, ApplicationListener {
26
+    private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class);
27
+
28
+    private String ip;
29
+    private int port = 9999;
30
+    private String appName;
31
+    private RegistHelper registHelper;
32
+
33
+    public void setIp(String ip) {
34
+        this.ip = ip;
35
+    }
36
+    public void setPort(int port) {
37
+        this.port = port;
38
+    }
39
+    public void setAppName(String appName) {
40
+        this.appName = appName;
41
+    }
42
+    public void setRegistHelper(RegistHelper registHelper) {
43
+        this.registHelper = registHelper;
44
+    }
45
+
46
+    // ---------------------------------- job server ------------------------------------
47
+    private NetComServerFactory serverFactory = new NetComServerFactory();
48
+    public void start() throws Exception {
49
+        NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());
50
+        serverFactory.start(port, ip, appName, registHelper);
51
+    }
52
+    public void destroy(){
53
+        serverFactory.destroy();
54
+    }
55
+
56
+    // ---------------------------------- init job handler ------------------------------------
57
+	@Override
58
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
59
+
60
+        // init job handler action
61
+        Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHander.class);
62
+
63
+        if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
64
+            for (Object serviceBean : serviceBeanMap.values()) {
65
+                if (serviceBean instanceof IJobHandler){
66
+                    String name = serviceBean.getClass().getAnnotation(JobHander.class).value();
67
+                    IJobHandler handler = (IJobHandler) serviceBean;
68
+                    registJobHandler(name, handler);
69
+                }
70
+            }
71
+        }
72
+	}
73
+
74
+    // ---------------------------------- destory job executor ------------------------------------
75
+    @Override
76
+    public void onApplicationEvent(ApplicationEvent applicationEvent) {
77
+        if(applicationEvent instanceof ContextClosedEvent){
78
+            // TODO
79
+        }
80
+    }
81
+
82
+    // ---------------------------------- job handler repository
83
+    private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
84
+    public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
85
+        logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
86
+        return jobHandlerRepository.put(name, jobHandler);
87
+    }
88
+    public static IJobHandler loadJobHandler(String name){
89
+        return jobHandlerRepository.get(name);
90
+    }
91
+
92
+    // ---------------------------------- job thread repository
93
+    private static ConcurrentHashMap<String, JobThread> JobThreadRepository = new ConcurrentHashMap<String, JobThread>();
94
+    public static JobThread registJobThread(String jobkey, IJobHandler handler){
95
+        JobThread jobThread = new JobThread(handler);
96
+        jobThread.start();
97
+        logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobkey:{}, handler:{}", new Object[]{jobkey, handler});
98
+        JobThreadRepository.put(jobkey, jobThread);	// putIfAbsent | oh my god, map's put method return the old value!!!
99
+        return jobThread;
100
+    }
101
+    public static JobThread loadJobThread(String jobKey){
102
+        return JobThreadRepository.get(jobKey);
103
+    }
104
+
105
+}

+ 0 - 158
xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java Vedi File

@@ -1,158 +0,0 @@
1
-package com.xxl.job.core.executor.jetty;
2
-
3
-import com.xxl.job.core.handler.IJobHandler;
4
-import com.xxl.job.core.handler.annotation.JobHander;
5
-import com.xxl.job.core.registry.RegistHelper;
6
-import com.xxl.job.core.router.HandlerRouter;
7
-import com.xxl.job.core.util.IpUtil;
8
-import org.eclipse.jetty.server.Connector;
9
-import org.eclipse.jetty.server.Handler;
10
-import org.eclipse.jetty.server.Server;
11
-import org.eclipse.jetty.server.handler.HandlerCollection;
12
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
13
-import org.eclipse.jetty.util.thread.ExecutorThreadPool;
14
-import org.slf4j.Logger;
15
-import org.slf4j.LoggerFactory;
16
-import org.springframework.beans.BeansException;
17
-import org.springframework.context.ApplicationContext;
18
-import org.springframework.context.ApplicationContextAware;
19
-import org.springframework.context.ApplicationEvent;
20
-import org.springframework.context.ApplicationListener;
21
-import org.springframework.context.event.ContextClosedEvent;
22
-
23
-import java.util.Map;
24
-import java.util.concurrent.TimeUnit;
25
-
26
-/**
27
- * Created by xuxueli on 2016/3/2 21:14.
28
- */
29
-public class XxlJobExecutor implements ApplicationContextAware, ApplicationListener {
30
-    private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class);
31
-
32
-    private String ip;
33
-    private int port = 9999;
34
-    private String appName;
35
-    private RegistHelper registHelper;
36
-
37
-    public void setIp(String ip) {
38
-        this.ip = ip;
39
-    }
40
-    public void setPort(int port) {
41
-        this.port = port;
42
-    }
43
-    public void setAppName(String appName) {
44
-        this.appName = appName;
45
-    }
46
-    public void setRegistHelper(RegistHelper registHelper) {
47
-        this.registHelper = registHelper;
48
-    }
49
-
50
-    // ---------------------------------- job server ------------------------------------
51
-    private Server server = null;
52
-    public void start() throws Exception {
53
-
54
-        Thread executorTnread = new Thread(new Runnable() {
55
-            @Override
56
-            public void run() {
57
-                server = new Server();
58
-                server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
59
-
60
-                // connector
61
-                SelectChannelConnector connector = new SelectChannelConnector();
62
-                connector.setPort(port);
63
-                connector.setMaxIdleTime(30000);
64
-                server.setConnectors(new Connector[] { connector });
65
-
66
-                // handler
67
-                HandlerCollection handlerc =new HandlerCollection();
68
-                handlerc.setHandlers(new Handler[]{new XxlJobExecutorHandler()});
69
-                server.setHandler(handlerc);
70
-
71
-                try {
72
-                    server.start();
73
-                    logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
74
-                    registryBeat();
75
-                    server.join();  // block until thread stopped
76
-                    logger.info(">>>>>>>>>>>> xxl-job jetty server join success at port:{}.", port);
77
-                } catch (Exception e) {
78
-                    e.printStackTrace();
79
-                }
80
-            }
81
-        });
82
-        executorTnread.setDaemon(true); // daemon, service jvm, user thread leave >>> daemon leave >>> jvm leave
83
-        executorTnread.start();
84
-    }
85
-    
86
-    public void destroy(){
87
-    	if (server!=null) {
88
-    		try {
89
-				server.stop();
90
-			} catch (Exception e) {
91
-				e.printStackTrace();
92
-			}
93
-		}
94
-    }
95
-
96
-    private void registryBeat(){
97
-        if (registHelper==null && appName==null || appName.trim().length()==0) {
98
-            return;
99
-        }
100
-        Thread registryThread = new Thread(new Runnable() {
101
-            @Override
102
-            public void run() {
103
-                while (true) {
104
-                    try {
105
-
106
-                        // generate addredd = ip:port
107
-                        String address = null;
108
-                        if (ip != null && ip.trim().length()>0) {
109
-                            address = ip.trim().concat(":").concat(String.valueOf(port));
110
-                        } else {
111
-                            address = IpUtil.getIpPort(port);
112
-                        }
113
-
114
-                        registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address);
115
-                        TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
116
-                    } catch (Exception e) {
117
-                        e.printStackTrace();
118
-                    }
119
-                }
120
-            }
121
-        });
122
-        registryThread.setDaemon(true);
123
-        registryThread.start();
124
-    }
125
-
126
-    // ---------------------------------- init job handler ------------------------------------
127
-    public static ApplicationContext applicationContext;
128
-	@Override
129
-	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
130
-		XxlJobExecutor.applicationContext = applicationContext;
131
-		initJobHandler();
132
-	}
133
-	
134
-	/**
135
-	 * init job handler action
136
-	 */
137
-	public void initJobHandler(){
138
-		Map<String, Object> serviceBeanMap = XxlJobExecutor.applicationContext.getBeansWithAnnotation(JobHander.class);
139
-        if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
140
-            for (Object serviceBean : serviceBeanMap.values()) {
141
-                if (serviceBean instanceof IJobHandler){
142
-                    String name = serviceBean.getClass().getAnnotation(JobHander.class).value();
143
-                    IJobHandler handler = (IJobHandler) serviceBean;
144
-                    HandlerRouter.registJobHandler(name, handler);
145
-                }
146
-            }
147
-        }
148
-	}
149
-
150
-    // ---------------------------------- destory job executor ------------------------------------
151
-    @Override
152
-    public void onApplicationEvent(ApplicationEvent applicationEvent) {
153
-        if(applicationEvent instanceof ContextClosedEvent){
154
-            // TODO
155
-        }
156
-    }
157
-
158
-}

+ 0 - 56
xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutorHandler.java Vedi File

@@ -1,56 +0,0 @@
1
-package com.xxl.job.core.executor.jetty;
2
-
3
-import com.xxl.job.core.router.HandlerRouter;
4
-import com.xxl.job.core.router.model.RequestModel;
5
-import com.xxl.job.core.router.model.ResponseModel;
6
-import com.xxl.job.core.util.XxlJobNetCommUtil;
7
-import org.eclipse.jetty.server.Request;
8
-import org.eclipse.jetty.server.handler.AbstractHandler;
9
-import org.slf4j.Logger;
10
-import org.slf4j.LoggerFactory;
11
-
12
-import javax.servlet.ServletException;
13
-import javax.servlet.http.HttpServletRequest;
14
-import javax.servlet.http.HttpServletResponse;
15
-import java.io.IOException;
16
-
17
-/**
18
- * Created by xuxueli on 2016/3/2 21:23.
19
- */
20
-public class XxlJobExecutorHandler extends AbstractHandler {
21
-    private static Logger logger = LoggerFactory.getLogger(XxlJobExecutorHandler.class);
22
-
23
-	@Override
24
-	public void handle(String s, Request baseRequest, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
25
-
26
-		httpServletRequest.setCharacterEncoding("UTF-8");
27
-		httpServletResponse.setCharacterEncoding("UTF-8");
28
-
29
-        // parse hex-json to request model
30
-        String requestHex = httpServletRequest.getParameter(XxlJobNetCommUtil.HEX);
31
-        ResponseModel responseModel = null;
32
-        if (requestHex!=null && requestHex.trim().length()>0) {
33
-            try {
34
-                // route trigger
35
-                RequestModel requestModel = XxlJobNetCommUtil.parseHexJson2Obj(requestHex, RequestModel.class);
36
-                responseModel = HandlerRouter.route(requestModel);
37
-            } catch (Exception e) {
38
-                logger.error("", e);
39
-                responseModel = new ResponseModel(ResponseModel.SUCCESS, e.getMessage());
40
-            }
41
-        }
42
-        if (responseModel == null) {
43
-            responseModel = new ResponseModel(ResponseModel.SUCCESS, "系统异常");
44
-        }
45
-
46
-        // format response model to hex-json
47
-        String responseHex = XxlJobNetCommUtil.formatObj2HexJson(responseModel);
48
-
49
-        // return
50
-		httpServletResponse.setContentType("text/plain;charset=utf-8");
51
-		httpServletResponse.setStatus(HttpServletResponse.SC_OK);
52
-		baseRequest.setHandled(true);
53
-		httpServletResponse.getWriter().println(responseHex);
54
-	}
55
-
56
-}

+ 0 - 61
xxl-job-core/src/main/java/com/xxl/job/core/executor/servlet/XxlJobServlet.java Vedi File

@@ -1,61 +0,0 @@
1
-//package com.xxl.job.client.netcom.servlet;
2
-//
3
-//
4
-//import java.io.IOException;
5
-//import java.util.HashMap;
6
-//import java.util.Map;
7
-//
8
-//import javax.servlet.ServletException;
9
-//import javax.servlet.http.HttpServlet;
10
-//import javax.servlet.http.HttpServletRequest;
11
-//import javax.servlet.http.HttpServletResponse;
12
-//
13
-//import com.xxl.job.client.handler.HandlerRouter;
14
-//
15
-//
16
-///**
17
-// * remote job client on http
18
-// * @author xuxueli 2015-12-19 18:36:47
19
-// */
20
-//@Deprecated
21
-//public class XxlJobServlet extends HttpServlet {
22
-//	private static final long serialVersionUID = 1L;
23
-//
24
-//    /**
25
-//     * Default constructor. 
26
-//     */
27
-//    public XxlJobServlet() {
28
-//        // TODO Auto-generated constructor stub
29
-//    }
30
-//    
31
-//	/**
32
-//	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
33
-//	 */
34
-//	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35
-//		request.setCharacterEncoding("UTF-8");
36
-//		response.setCharacterEncoding("UTF-8");
37
-//		
38
-//		Map<String, String> _param = new HashMap<String, String>();
39
-//		if (request.getParameterMap()!=null && request.getParameterMap().size()>0) {
40
-//			for (Object paramKey : request.getParameterMap().keySet()) {
41
-//				if (paramKey!=null) {
42
-//					String paramKeyStr = paramKey.toString();
43
-//					_param.put(paramKeyStr, request.getParameter(paramKeyStr));
44
-//				}
45
-//			}
46
-//		}
47
-//		
48
-//		String resp = HandlerRouter.action(_param);
49
-//		response.getWriter().append(resp);
50
-//		return;
51
-//	}
52
-//
53
-//	/**
54
-//	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
55
-//	 */
56
-//	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
57
-//		// TODO Auto-generated method stub
58
-//		doGet(request, response);
59
-//	}
60
-//
61
-//}

+ 1 - 3
xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java Vedi File

@@ -1,12 +1,10 @@
1 1
 package com.xxl.job.core.handler;
2 2
 
3
-import com.xxl.job.core.router.HandlerRouter;
4
-
5 3
 /**
6 4
  * remote job handler
7 5
  * @author xuxueli 2015-12-19 19:06:38
8 6
  */
9
-public abstract class IJobHandler extends HandlerRouter {
7
+public abstract class IJobHandler {
10 8
 	
11 9
 	/**
12 10
 	 * job handler <br><br>

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

@@ -1,100 +0,0 @@
1
-package com.xxl.job.core.router;
2
-
3
-import com.xxl.job.core.handler.IJobHandler;
4
-import com.xxl.job.core.router.action.BeatAction;
5
-import com.xxl.job.core.router.action.KillAction;
6
-import com.xxl.job.core.router.action.LogAction;
7
-import com.xxl.job.core.router.action.RunAction;
8
-import com.xxl.job.core.router.model.RequestModel;
9
-import com.xxl.job.core.router.model.ResponseModel;
10
-import com.xxl.job.core.router.thread.JobThread;
11
-import org.slf4j.Logger;
12
-import org.slf4j.LoggerFactory;
13
-
14
-import java.util.concurrent.ConcurrentHashMap;
15
-
16
-/**
17
- * handler repository
18
- * @author xuxueli 2015-12-19 19:28:44
19
- */
20
-public class HandlerRouter {
21
-	private static Logger logger = LoggerFactory.getLogger(HandlerRouter.class);
22
-
23
-	/**
24
-	 * job handler repository
25
-     */
26
-	private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
27
-	public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
28
-		logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
29
-		return HandlerRouter.jobHandlerRepository.put(name, jobHandler);
30
-	}
31
-	public static IJobHandler loadJobHandler(String name){
32
-		return HandlerRouter.jobHandlerRepository.get(name);
33
-	}
34
-
35
-	/**
36
-	 * job thread repository
37
-     */
38
-	private static ConcurrentHashMap<String, JobThread> JobThreadRepository = new ConcurrentHashMap<String, JobThread>();
39
-	public static JobThread registJobThread(String jobkey, IJobHandler handler){
40
-		JobThread jobThread = new JobThread(handler);
41
-		jobThread.start();
42
-		logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobkey:{}, handler:{}", new Object[]{jobkey, handler});
43
-		HandlerRouter.JobThreadRepository.put(jobkey, jobThread);	// putIfAbsent | oh my god, map's put method return the old value!!!
44
-		return jobThread;
45
-	}
46
-	public static JobThread loadJobThread(String jobKey){
47
-		return HandlerRouter.JobThreadRepository.get(jobKey);
48
-	}
49
-
50
-	/**
51
-	 * route action repository
52
-	 */
53
-	public enum ActionRepository {
54
-		RUN(new RunAction()),
55
-		KILL(new KillAction()),
56
-		LOG(new LogAction()),
57
-		BEAT(new BeatAction());
58
-
59
-		private IAction action;
60
-		private ActionRepository(IAction action){
61
-			this.action = action;
62
-		}
63
-
64
-		/**
65
-		 * match Action by enum name
66
-		 * @param name
67
-         * @return action
68
-         */
69
-		public static IAction matchAction(String name){
70
-			if (name!=null && name.trim().length()>0) {
71
-				for (ActionRepository item : ActionRepository.values()) {
72
-					if (item.name().equals(name)) {
73
-						return item.action;
74
-					}
75
-				}
76
-			}
77
-			return null;
78
-		}
79
-
80
-	}
81
-
82
-	// handler push to queue
83
-	public static ResponseModel route(RequestModel requestModel) {
84
-		logger.debug(">>>>>>>>>>> xxl-job route, RequestModel:{}", new Object[]{requestModel.toString()});
85
-
86
-		// timestamp check
87
-		if (System.currentTimeMillis() - requestModel.getTimestamp() > 60000) {
88
-			return new ResponseModel(ResponseModel.FAIL, "Timestamp Timeout.");
89
-		}
90
-
91
-		// match action
92
-		IAction action = ActionRepository.matchAction(requestModel.getAction());
93
-		if (action == null) {
94
-			return new ResponseModel(ResponseModel.FAIL, "Action match fail.");
95
-		}
96
-
97
-		return action.execute(requestModel);
98
-	}
99
-
100
-}

+ 0 - 13
xxl-job-core/src/main/java/com/xxl/job/core/router/IAction.java Vedi File

@@ -1,13 +0,0 @@
1
-package com.xxl.job.core.router;
2
-
3
-import com.xxl.job.core.router.model.RequestModel;
4
-import com.xxl.job.core.router.model.ResponseModel;
5
-
6
-/**
7
- * Created by xuxueli on 16/7/22.
8
- */
9
-public abstract class IAction {
10
-
11
-    public abstract ResponseModel execute(RequestModel requestModel);
12
-
13
-}

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

@@ -1,17 +0,0 @@
1
-package com.xxl.job.core.router.action;
2
-
3
-import com.xxl.job.core.router.IAction;
4
-import com.xxl.job.core.router.model.RequestModel;
5
-import com.xxl.job.core.router.model.ResponseModel;
6
-
7
-/**
8
- * Created by xuxueli on 16/7/22.
9
- */
10
-public class BeatAction extends IAction {
11
-
12
-    @Override
13
-    public ResponseModel execute(RequestModel requestModel) {
14
-        return new ResponseModel(ResponseModel.SUCCESS, "i am alive.");
15
-    }
16
-
17
-}

+ 0 - 35
xxl-job-core/src/main/java/com/xxl/job/core/router/action/KillAction.java Vedi File

@@ -1,35 +0,0 @@
1
-package com.xxl.job.core.router.action;
2
-
3
-import com.xxl.job.core.handler.IJobHandler;
4
-import com.xxl.job.core.router.HandlerRouter;
5
-import com.xxl.job.core.router.IAction;
6
-import com.xxl.job.core.router.model.RequestModel;
7
-import com.xxl.job.core.router.model.ResponseModel;
8
-import com.xxl.job.core.router.thread.JobThread;
9
-
10
-/**
11
- * Created by xuxueli on 16/7/22.
12
- */
13
-public class KillAction extends IAction {
14
-
15
-    @Override
16
-    public ResponseModel execute(RequestModel requestModel) {
17
-
18
-        // generate jobKey
19
-        String jobKey = requestModel.getJobGroup().concat("_").concat(requestModel.getJobName());
20
-
21
-        // kill handlerThread, and create new one
22
-        JobThread jobThread = HandlerRouter.loadJobThread(jobKey);
23
-
24
-        if (jobThread != null) {
25
-            IJobHandler handler = jobThread.getHandler();
26
-            jobThread.toStop("人工手动终止");
27
-            jobThread.interrupt();
28
-            HandlerRouter.registJobThread(jobKey, handler);
29
-            return new ResponseModel(ResponseModel.SUCCESS, "job thread kill success.");
30
-        }
31
-
32
-        return new ResponseModel(ResponseModel.FAIL, "job thread not found.");
33
-    }
34
-
35
-}

+ 0 - 24
xxl-job-core/src/main/java/com/xxl/job/core/router/action/LogAction.java Vedi File

@@ -1,24 +0,0 @@
1
-package com.xxl.job.core.router.action;
2
-
3
-import com.xxl.job.core.log.XxlJobFileAppender;
4
-import com.xxl.job.core.router.IAction;
5
-import com.xxl.job.core.router.model.RequestModel;
6
-import com.xxl.job.core.router.model.ResponseModel;
7
-
8
-import java.util.Date;
9
-
10
-/**
11
- * Created by xuxueli on 16/7/22.
12
- */
13
-public class LogAction extends IAction {
14
-
15
-    @Override
16
-    public ResponseModel execute(RequestModel requestModel) {
17
-        // log filename: yyyy-MM-dd/9999.log
18
-        String logFileName = XxlJobFileAppender.makeLogFileName(new Date(requestModel.getLogDateTim()), requestModel.getLogId());
19
-
20
-        String logConteng = XxlJobFileAppender.readLog(logFileName);
21
-        return new ResponseModel(ResponseModel.SUCCESS, logConteng);
22
-    }
23
-
24
-}

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

@@ -1,76 +0,0 @@
1
-package com.xxl.job.core.router.action;
2
-
3
-import com.xxl.job.core.glue.GlueFactory;
4
-import com.xxl.job.core.handler.IJobHandler;
5
-import com.xxl.job.core.handler.impl.GlueJobHandler;
6
-import com.xxl.job.core.router.HandlerRouter;
7
-import com.xxl.job.core.router.IAction;
8
-import com.xxl.job.core.router.model.RequestModel;
9
-import com.xxl.job.core.router.model.ResponseModel;
10
-import com.xxl.job.core.router.thread.JobThread;
11
-
12
-/**
13
- * Created by xuxueli on 16/7/22.
14
- */
15
-public class RunAction extends IAction {
16
-
17
-    @Override
18
-    public ResponseModel execute(RequestModel requestModel) {
19
-
20
-        // generate jobKey
21
-        String jobKey = requestModel.getJobGroup().concat("_").concat(requestModel.getJobName());
22
-
23
-        // load old thread
24
-        JobThread jobThread = HandlerRouter.loadJobThread(jobKey);
25
-
26
-        if (!requestModel.isGlueSwitch()) {
27
-            // bean model
28
-
29
-            // valid handler instance
30
-            IJobHandler jobHandler = HandlerRouter.loadJobHandler(requestModel.getExecutorHandler());
31
-            if (jobHandler==null) {
32
-                return new ResponseModel(ResponseModel.FAIL, "job handler for jobKey=[" + jobKey + "] not found.");
33
-            }
34
-
35
-            if (jobThread == null) {
36
-                jobThread = HandlerRouter.registJobThread(jobKey, jobHandler);
37
-            } else {
38
-                // job handler update, kill old job thread
39
-                if (jobThread.getHandler() != jobHandler) {
40
-                    // kill old job thread
41
-                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
42
-                    jobThread.interrupt();
43
-
44
-                    // new thread, with new job handler
45
-                    jobThread = HandlerRouter.registJobThread(jobKey, jobHandler);
46
-                }
47
-            }
48
-        } else {
49
-            // glue model
50
-
51
-            // valid glueloader
52
-            if (!GlueFactory.isActive()) {
53
-                return new ResponseModel(ResponseModel.FAIL, "glueLoader for jobKey=[" + jobKey + "] not found.");
54
-            }
55
-
56
-            if (jobThread == null) {
57
-                jobThread = HandlerRouter.registJobThread(jobKey, new GlueJobHandler(requestModel.getJobGroup(), requestModel.getJobName()));
58
-            } else {
59
-                // job handler update, kill old job thread
60
-                if (!(jobThread.getHandler() instanceof GlueJobHandler)) {
61
-                    // kill old job thread
62
-                    jobThread.toStop("更换任务模式或JobHandler,终止旧任务线程");
63
-                    jobThread.interrupt();
64
-
65
-                    // new thread, with new job handler
66
-                    jobThread = HandlerRouter.registJobThread(jobKey, new GlueJobHandler(requestModel.getJobGroup(), requestModel.getJobName()));
67
-                }
68
-            }
69
-        }
70
-
71
-        // push data to queue
72
-        jobThread.pushTriggerQueue(requestModel);
73
-        return new ResponseModel(ResponseModel.SUCCESS, null);
74
-    }
75
-
76
-}

+ 0 - 45
xxl-job-core/src/main/java/com/xxl/job/core/router/model/ResponseModel.java Vedi File

@@ -1,45 +0,0 @@
1
-package com.xxl.job.core.router.model;
2
-
3
-/**
4
- * Created by xuxueli on 16/7/22.
5
- */
6
-public class ResponseModel {
7
-    public static final String SUCCESS = "SUCCESS";
8
-    public static final String FAIL = "FAIL";
9
-
10
-    private String status;
11
-    private String msg;
12
-
13
-    public ResponseModel() {
14
-    }
15
-
16
-    public ResponseModel(String status, String msg) {
17
-        this.status = status;
18
-        this.msg = msg;
19
-    }
20
-
21
-    public String getStatus() {
22
-        return status;
23
-    }
24
-
25
-    public void setStatus(String status) {
26
-        this.status = status;
27
-    }
28
-
29
-    public String getMsg() {
30
-        return msg;
31
-    }
32
-
33
-    public void setMsg(String msg) {
34
-        this.msg = msg;
35
-    }
36
-
37
-    @Override
38
-    public String toString() {
39
-        return "ResponseModel{" +
40
-                "status='" + status + '\'' +
41
-                ", msg='" + msg + '\'' +
42
-                '}';
43
-    }
44
-
45
-}

+ 69 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java Vedi File

@@ -0,0 +1,69 @@
1
+package com.xxl.job.core.rpc.codec;
2
+
3
+import java.io.Serializable;
4
+import java.util.Arrays;
5
+
6
+/**
7
+ * request
8
+ * @author xuxueli 2015-10-29 19:39:12
9
+ */
10
+public class RpcRequest implements Serializable{
11
+	private static final long serialVersionUID = 1L;
12
+	
13
+	private String serverAddress;
14
+	private long createMillisTime;
15
+
16
+    private String className;
17
+    private String methodName;
18
+    private Class<?>[] parameterTypes;
19
+    private Object[] parameters;
20
+
21
+	public String getServerAddress() {
22
+		return serverAddress;
23
+	}
24
+
25
+	public void setServerAddress(String serverAddress) {
26
+		this.serverAddress = serverAddress;
27
+	}
28
+
29
+	public long getCreateMillisTime() {
30
+		return createMillisTime;
31
+	}
32
+	public void setCreateMillisTime(long createMillisTime) {
33
+		this.createMillisTime = createMillisTime;
34
+	}
35
+	public String getClassName() {
36
+		return className;
37
+	}
38
+	public void setClassName(String className) {
39
+		this.className = className;
40
+	}
41
+	public String getMethodName() {
42
+		return methodName;
43
+	}
44
+	public void setMethodName(String methodName) {
45
+		this.methodName = methodName;
46
+	}
47
+	public Class<?>[] getParameterTypes() {
48
+		return parameterTypes;
49
+	}
50
+	public void setParameterTypes(Class<?>[] parameterTypes) {
51
+		this.parameterTypes = parameterTypes;
52
+	}
53
+	public Object[] getParameters() {
54
+		return parameters;
55
+	}
56
+	public void setParameters(Object[] parameters) {
57
+		this.parameters = parameters;
58
+	}
59
+	
60
+	@Override
61
+	public String toString() {
62
+		return "NettyRequest [serverAddress=" + serverAddress + ", createMillisTime="
63
+				+ createMillisTime + ", className=" + className
64
+				+ ", methodName=" + methodName + ", parameterTypes="
65
+				+ Arrays.toString(parameterTypes) + ", parameters="
66
+				+ Arrays.toString(parameters) + "]";
67
+	}
68
+	
69
+}

+ 41 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcResponse.java Vedi File

@@ -0,0 +1,41 @@
1
+package com.xxl.job.core.rpc.codec;
2
+
3
+import java.io.Serializable;
4
+
5
+/**
6
+ * response
7
+ * @author xuxueli 2015-10-29 19:39:54
8
+ */
9
+public class RpcResponse implements Serializable{
10
+	private static final long serialVersionUID = 1L;
11
+	
12
+    private String error;
13
+    private Object result;
14
+
15
+    public boolean isError() {
16
+        return error != null;
17
+    }
18
+
19
+    public String getError() {
20
+        return error;
21
+    }
22
+
23
+    public void setError(String error) {
24
+        this.error = error;
25
+    }
26
+
27
+    public Object getResult() {
28
+        return result;
29
+    }
30
+
31
+    public void setResult(Object result) {
32
+        this.result = result;
33
+    }
34
+
35
+	@Override
36
+	public String toString() {
37
+		return "NettyResponse [error=" + error
38
+				+ ", result=" + result + "]";
39
+	}
40
+
41
+}

+ 73 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java Vedi File

@@ -0,0 +1,73 @@
1
+package com.xxl.job.core.rpc.netcom;
2
+
3
+import com.xxl.job.core.rpc.codec.RpcRequest;
4
+import com.xxl.job.core.rpc.codec.RpcResponse;
5
+import com.xxl.job.core.rpc.netcom.jetty.client.JettyClient;
6
+import org.slf4j.Logger;
7
+import org.slf4j.LoggerFactory;
8
+import org.springframework.beans.factory.FactoryBean;
9
+
10
+import java.lang.reflect.InvocationHandler;
11
+import java.lang.reflect.Method;
12
+import java.lang.reflect.Proxy;
13
+
14
+/**
15
+ * rpc proxy
16
+ * @author xuxueli 2015-10-29 20:18:32
17
+ */
18
+public class NetComClientProxy implements FactoryBean<Object> {
19
+	private static final Logger logger = LoggerFactory.getLogger(NetComClientProxy.class);
20
+
21
+	// ---------------------- config ----------------------
22
+	private Class<?> iface;
23
+	String serverAddress;
24
+	JettyClient client = new JettyClient();
25
+	public NetComClientProxy(Class<?> iface, String serverAddress) {
26
+		this.iface = iface;
27
+		this.serverAddress = serverAddress;
28
+	}
29
+
30
+	@Override
31
+	public Object getObject() throws Exception {
32
+		return Proxy.newProxyInstance(Thread.currentThread()
33
+				.getContextClassLoader(), new Class[] { iface },
34
+				new InvocationHandler() {
35
+					@Override
36
+					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
37
+						
38
+						// request
39
+						RpcRequest request = new RpcRequest();
40
+	                    request.setServerAddress(serverAddress);
41
+	                    request.setCreateMillisTime(System.currentTimeMillis());
42
+	                    request.setClassName(method.getDeclaringClass().getName());
43
+	                    request.setMethodName(method.getName());
44
+	                    request.setParameterTypes(method.getParameterTypes());
45
+	                    request.setParameters(args);
46
+	                    
47
+	                    // send
48
+	                    RpcResponse response = client.send(request);
49
+	                    
50
+	                    // valid response
51
+						if (response == null) {
52
+							logger.error(">>>>>>>>>>> xxl-rpc netty response not found.");
53
+							throw new Exception(">>>>>>>>>>> xxl-rpc netty response not found.");
54
+						}
55
+	                    if (response.isError()) {
56
+	                        throw new RuntimeException(response.getError());
57
+	                    } else {
58
+	                        return response.getResult();
59
+	                    }
60
+	                   
61
+					}
62
+				});
63
+	}
64
+	@Override
65
+	public Class<?> getObjectType() {
66
+		return iface;
67
+	}
68
+	@Override
69
+	public boolean isSingleton() {
70
+		return false;
71
+	}
72
+
73
+}

+ 77 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java Vedi File

@@ -0,0 +1,77 @@
1
+package com.xxl.job.core.rpc.netcom;
2
+
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.job.core.registry.RegistHelper;
5
+import com.xxl.job.core.rpc.codec.RpcRequest;
6
+import com.xxl.job.core.rpc.codec.RpcResponse;
7
+import com.xxl.job.core.rpc.netcom.jetty.server.JettyServer;
8
+import org.slf4j.Logger;
9
+import org.slf4j.LoggerFactory;
10
+import org.springframework.cglib.reflect.FastClass;
11
+import org.springframework.cglib.reflect.FastMethod;
12
+
13
+import java.util.HashMap;
14
+import java.util.Map;
15
+
16
+/**
17
+ * netcom init
18
+ * @author xuxueli 2015-10-31 22:54:27
19
+ */
20
+public class NetComServerFactory  {
21
+	private static final Logger logger = LoggerFactory.getLogger(NetComServerFactory.class);
22
+
23
+	// ---------------------- server start ----------------------
24
+	JettyServer server = new JettyServer();
25
+	public void start(int port, String ip, String appName, RegistHelper registHelper) throws Exception {
26
+		server.start(port, ip, appName, registHelper);
27
+	}
28
+
29
+	// ---------------------- server destroy ----------------------
30
+	public void destroy(){
31
+		server.destroy();
32
+	}
33
+
34
+	// ---------------------- server init ----------------------
35
+	/**
36
+	 * init local rpc service map
37
+	 */
38
+	private static Map<String, Object> serviceMap = new HashMap<String, Object>();
39
+	public static void putService(Class<?> iface, Object serviceBean){
40
+		serviceMap.put(iface.getName(), serviceBean);
41
+	}
42
+	public static RpcResponse invokeService(RpcRequest request, Object serviceBean) {
43
+		if (serviceBean==null) {
44
+			serviceBean = serviceMap.get(request.getClassName());
45
+		}
46
+		if (serviceBean == null) {
47
+			// TODO
48
+		}
49
+
50
+		RpcResponse response = new RpcResponse();
51
+
52
+		if (System.currentTimeMillis() - request.getCreateMillisTime() > 60000) {
53
+			response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "Timestamp Timeout."));
54
+			return response;
55
+		}
56
+
57
+		try {
58
+			Class<?> serviceClass = serviceBean.getClass();
59
+			String methodName = request.getMethodName();
60
+			Class<?>[] parameterTypes = request.getParameterTypes();
61
+			Object[] parameters = request.getParameters();
62
+
63
+			FastClass serviceFastClass = FastClass.create(serviceClass);
64
+			FastMethod serviceFastMethod = serviceFastClass.getMethod(methodName, parameterTypes);
65
+
66
+			Object result = serviceFastMethod.invoke(serviceBean, parameters);
67
+
68
+			response.setResult(result);
69
+		} catch (Throwable t) {
70
+			t.printStackTrace();
71
+			response.setError(t.getMessage());
72
+		}
73
+
74
+		return response;
75
+	}
76
+
77
+}

+ 20 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java Vedi File

@@ -0,0 +1,20 @@
1
+package com.xxl.job.core.rpc.netcom.jetty.client;
2
+
3
+import com.xxl.job.core.rpc.codec.RpcRequest;
4
+import com.xxl.job.core.rpc.codec.RpcResponse;
5
+import com.xxl.job.core.rpc.serialize.HessianSerializer;
6
+import com.xxl.job.core.util.HttpClientUtil;
7
+
8
+/**
9
+ * jetty client
10
+ * @author xuxueli 2015-11-24 22:25:15
11
+ */
12
+public class JettyClient {
13
+
14
+	public RpcResponse send(RpcRequest request) throws Exception {
15
+		byte[] requestBytes = HessianSerializer.serialize(request);
16
+		byte[] responseBytes = HttpClientUtil.postRequest("http://" + request.getServerAddress() + "/", requestBytes);
17
+		return (RpcResponse) HessianSerializer.deserialize(responseBytes, RpcResponse.class);
18
+	}
19
+
20
+}

+ 107 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java Vedi File

@@ -0,0 +1,107 @@
1
+package com.xxl.job.core.rpc.netcom.jetty.server;
2
+
3
+import com.xxl.job.core.registry.RegistHelper;
4
+import com.xxl.job.core.util.IpUtil;
5
+import org.eclipse.jetty.server.Connector;
6
+import org.eclipse.jetty.server.Handler;
7
+import org.eclipse.jetty.server.Server;
8
+import org.eclipse.jetty.server.handler.HandlerCollection;
9
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
10
+import org.eclipse.jetty.util.thread.ExecutorThreadPool;
11
+import org.slf4j.Logger;
12
+import org.slf4j.LoggerFactory;
13
+
14
+import java.util.concurrent.TimeUnit;
15
+
16
+/**
17
+ * rpc jetty server
18
+ * @author xuxueli 2015-11-19 22:29:03
19
+ */
20
+public class JettyServer {
21
+	private static final Logger logger = LoggerFactory.getLogger(JettyServer.class);
22
+
23
+	private Server server;
24
+
25
+	public void start(final int port, final String ip, final String appName, final RegistHelper registHelper) throws Exception {
26
+		Thread thread = new Thread(new Runnable() {
27
+			@Override
28
+			public void run() {
29
+				server = new Server();
30
+				server.setThreadPool(new ExecutorThreadPool(200, 200, 30000));	// 非阻塞
31
+				
32
+				// connector
33
+				SelectChannelConnector connector = new SelectChannelConnector();
34
+				connector.setPort(port);
35
+				connector.setMaxIdleTime(30000);
36
+				server.setConnectors(new Connector[] { connector });
37
+				
38
+				// handler
39
+				HandlerCollection handlerc =new HandlerCollection();  
40
+				handlerc.setHandlers(new Handler[]{new JettyServerHandler()});
41
+				server.setHandler(handlerc);
42
+
43
+				try {
44
+					server.start();
45
+					logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
46
+					executorRegistryBeat(port, ip, appName, registHelper);
47
+					server.join();	// block until thread stopped
48
+					logger.info(">>>>>>>>>>> xxl-rpc server start success, netcon={}, port={}", JettyServer.class.getName(), port);
49
+				} catch (Exception e) {
50
+					logger.error("", e);
51
+				} finally {
52
+					server.destroy();
53
+				}
54
+			}
55
+		});
56
+		thread.setDaemon(true);	// daemon, service jvm, user thread leave >>> daemon leave >>> jvm leave
57
+		thread.start();
58
+	}
59
+
60
+	public void destroy() {
61
+		if (server != null) {
62
+			try {
63
+				server.destroy();
64
+			} catch (Exception e) {
65
+				logger.error("", e);
66
+			}
67
+		}
68
+		logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
69
+	}
70
+
71
+	/**
72
+	 * registry beat
73
+	 * @param port
74
+	 * @param ip
75
+	 * @param appName
76
+	 * @param registHelper
77
+	 */
78
+	private void executorRegistryBeat(final int port, final String ip, final String appName, final RegistHelper registHelper){
79
+		if (registHelper==null && appName==null || appName.trim().length()==0) {
80
+			return;
81
+		}
82
+		Thread registryThread = new Thread(new Runnable() {
83
+			@Override
84
+			public void run() {
85
+				while (true) {
86
+					try {
87
+						// generate addredd = ip:port
88
+						String address = null;
89
+						if (ip != null && ip.trim().length()>0) {
90
+							address = ip.trim().concat(":").concat(String.valueOf(port));
91
+						} else {
92
+							address = IpUtil.getIpPort(port);
93
+						}
94
+
95
+						registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address);
96
+						TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
97
+					} catch (Exception e) {
98
+						e.printStackTrace();
99
+					}
100
+				}
101
+			}
102
+		});
103
+		registryThread.setDaemon(true);
104
+		registryThread.start();
105
+	}
106
+
107
+}

+ 47 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServerHandler.java Vedi File

@@ -0,0 +1,47 @@
1
+package com.xxl.job.core.rpc.netcom.jetty.server;
2
+
3
+import com.xxl.job.core.rpc.codec.RpcRequest;
4
+import com.xxl.job.core.rpc.codec.RpcResponse;
5
+import com.xxl.job.core.rpc.netcom.NetComServerFactory;
6
+import com.xxl.job.core.rpc.serialize.HessianSerializer;
7
+import com.xxl.job.core.util.HttpClientUtil;
8
+import org.eclipse.jetty.server.Request;
9
+import org.eclipse.jetty.server.handler.AbstractHandler;
10
+
11
+import javax.servlet.ServletException;
12
+import javax.servlet.http.HttpServletRequest;
13
+import javax.servlet.http.HttpServletResponse;
14
+import java.io.IOException;
15
+import java.io.OutputStream;
16
+
17
+/**
18
+ * jetty handler
19
+ * @author xuxueli 2015-11-19 22:32:36
20
+ */
21
+public class JettyServerHandler extends AbstractHandler {
22
+
23
+
24
+	@Override
25
+	public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
26
+		
27
+		// deserialize request
28
+		byte[] requestBytes = HttpClientUtil.readBytes(request);
29
+		RpcRequest rpcRequest = (RpcRequest) HessianSerializer.deserialize(requestBytes, RpcRequest.class);
30
+		
31
+		// invoke
32
+        RpcResponse rpcResponse = NetComServerFactory.invokeService(rpcRequest, null);
33
+
34
+        // serialize response
35
+        byte[] responseBytes = HessianSerializer.serialize(rpcResponse);
36
+		
37
+		response.setContentType("text/html;charset=utf-8");
38
+		response.setStatus(HttpServletResponse.SC_OK);
39
+		baseRequest.setHandled(true);
40
+		
41
+		OutputStream out = response.getOutputStream();
42
+		out.write(responseBytes);
43
+		out.flush();
44
+		
45
+	}
46
+
47
+}

+ 37 - 0
xxl-job-core/src/main/java/com/xxl/job/core/rpc/serialize/HessianSerializer.java Vedi File

@@ -0,0 +1,37 @@
1
+package com.xxl.job.core.rpc.serialize;
2
+
3
+import com.caucho.hessian.io.HessianInput;
4
+import com.caucho.hessian.io.HessianOutput;
5
+
6
+import java.io.ByteArrayInputStream;
7
+import java.io.ByteArrayOutputStream;
8
+import java.io.IOException;
9
+
10
+/**
11
+ * hessian serialize
12
+ * @author xuxueli 2015-9-26 02:53:29
13
+ */
14
+public class HessianSerializer  {
15
+
16
+	public static <T> byte[] serialize(T obj){
17
+		ByteArrayOutputStream os = new ByteArrayOutputStream();
18
+		HessianOutput ho = new HessianOutput(os);
19
+		try {
20
+			ho.writeObject(obj);
21
+		} catch (IOException e) {
22
+			throw new IllegalStateException(e.getMessage(), e);
23
+		}
24
+		return os.toByteArray();
25
+	}
26
+
27
+	public static <T> Object deserialize(byte[] bytes, Class<T> clazz) {
28
+		ByteArrayInputStream is = new ByteArrayInputStream(bytes);
29
+		HessianInput hi = new HessianInput(is);
30
+		try {
31
+			return hi.readObject();
32
+		} catch (IOException e) {
33
+			throw new IllegalStateException(e.getMessage(), e);
34
+		}
35
+	}
36
+	
37
+}

xxl-job-core/src/main/java/com/xxl/job/core/router/thread/JobThread.java → xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java Vedi File

@@ -1,9 +1,9 @@
1
-package com.xxl.job.core.router.thread;
1
+package com.xxl.job.core.thread;
2 2
 
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.job.core.biz.model.TriggerParam;
3 5
 import com.xxl.job.core.handler.IJobHandler;
4 6
 import com.xxl.job.core.log.XxlJobFileAppender;
5
-import com.xxl.job.core.router.model.RequestModel;
6
-import com.xxl.job.core.router.model.ResponseModel;
7 7
 import org.eclipse.jetty.util.ConcurrentHashSet;
8 8
 import org.slf4j.Logger;
9 9
 import org.slf4j.LoggerFactory;
@@ -23,7 +23,7 @@ public class JobThread extends Thread{
23 23
 	private static Logger logger = LoggerFactory.getLogger(JobThread.class);
24 24
 	
25 25
 	private IJobHandler handler;
26
-	private LinkedBlockingQueue<RequestModel> triggerQueue;
26
+	private LinkedBlockingQueue<TriggerParam> triggerQueue;
27 27
 	private ConcurrentHashSet<Integer> triggerLogIdSet;		// avoid repeat trigger for the same TRIGGER_LOG_ID
28 28
 
29 29
 	private boolean toStop = false;
@@ -31,21 +31,21 @@ public class JobThread extends Thread{
31 31
 
32 32
 	public JobThread(IJobHandler handler) {
33 33
 		this.handler = handler;
34
-		triggerQueue = new LinkedBlockingQueue<RequestModel>();
34
+		triggerQueue = new LinkedBlockingQueue<TriggerParam>();
35 35
 		triggerLogIdSet = new ConcurrentHashSet<Integer>();
36 36
 	}
37 37
 	public IJobHandler getHandler() {
38 38
 		return handler;
39 39
 	}
40 40
 
41
-	public void pushTriggerQueue(RequestModel requestModel) {
42
-		if (triggerLogIdSet.contains(requestModel.getLogId())) {
43
-			logger.debug("repeate trigger job, logId:{}", requestModel.getLogId());
41
+	public void pushTriggerQueue(TriggerParam triggerParam) {
42
+		if (triggerLogIdSet.contains(triggerParam.getLogId())) {
43
+			logger.debug("repeate trigger job, logId:{}", triggerParam.getLogId());
44 44
 			return;
45 45
 		}
46 46
 
47
-		triggerLogIdSet.add(requestModel.getLogId());
48
-		triggerQueue.add(requestModel);
47
+		triggerLogIdSet.add(triggerParam.getLogId());
48
+		triggerQueue.add(triggerParam);
49 49
 	}
50 50
 
51 51
 	public void toStop(String stopReason) {
@@ -64,46 +64,46 @@ public class JobThread extends Thread{
64 64
 		while(!toStop){
65 65
 			try {
66 66
 				// to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout)
67
-				RequestModel triggerDate = triggerQueue.poll(3L, TimeUnit.SECONDS);
68
-				if (triggerDate!=null) {
69
-					triggerLogIdSet.remove(triggerDate.getLogId());
67
+				TriggerParam triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS);
68
+				if (triggerParam!=null) {
69
+					triggerLogIdSet.remove(triggerParam.getLogId());
70 70
 					
71 71
 					// parse param
72
-					String[] handlerParams = (triggerDate.getExecutorParams()!=null && triggerDate.getExecutorParams().trim().length()>0)
73
-							? (String[])(Arrays.asList(triggerDate.getExecutorParams().split(",")).toArray()) : null;
72
+					String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0)
73
+							? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null;
74 74
 					
75 75
 					// handle job
76
-					String _status = ResponseModel.SUCCESS;
76
+					int _code = ReturnT.SUCCESS_CODE;
77 77
 					String _msg = null;
78 78
 
79 79
 					try {
80 80
 						// log filename: yyyy-MM-dd/9999.log
81
-						String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerDate.getLogDateTim()), triggerDate.getLogId());
81
+						String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId());
82 82
 
83 83
 						XxlJobFileAppender.contextHolder.set(logFileName);
84 84
 						logger.info("----------- xxl-job job execute start -----------");
85 85
 						handler.execute(handlerParams);
86 86
 					} catch (Exception e) {
87 87
 						logger.error("JobThread Exception:", e);
88
-						_status = ResponseModel.FAIL;
88
+						_code = ReturnT.FAIL_CODE;
89 89
 						StringWriter out = new StringWriter();
90 90
 						e.printStackTrace(new PrintWriter(out));
91 91
 						_msg = out.toString();
92 92
 					}
93
-					logger.info("----------- xxl-job job execute end ----------- <br> Look : ExecutorParams:{}, Status:{}, Msg:{}",
94
-							new Object[]{handlerParams, _status, _msg});
93
+					logger.info("----------- xxl-job job execute end ----------- <br> Look : ExecutorParams:{}, Code:{}, Msg:{}",
94
+							new Object[]{handlerParams, _code, _msg});
95 95
 					
96 96
 					// callback handler info
97 97
 					if (!toStop) {
98 98
 						// commonm
99
-						triggerDate.setStatus(_status);
100
-						triggerDate.setMsg(_msg);
101
-						TriggerCallbackThread.pushCallBack(triggerDate);
99
+						triggerParam.setStatus(_code+"");
100
+						triggerParam.setMsg(_msg);
101
+						TriggerCallbackThread.pushCallBack(triggerParam);
102 102
 					} else {
103 103
 						// is killed
104
-						triggerDate.setStatus(ResponseModel.FAIL);
105
-						triggerDate.setMsg(stopReason + " [业务运行中,被强制终止]");
106
-						TriggerCallbackThread.pushCallBack(triggerDate);
104
+						triggerParam.setStatus(ReturnT.FAIL_CODE+"");
105
+						triggerParam.setMsg(stopReason + " [业务运行中,被强制终止]");
106
+						TriggerCallbackThread.pushCallBack(triggerParam);
107 107
 					}
108 108
 				}
109 109
 			} catch (Exception e) {
@@ -113,12 +113,12 @@ public class JobThread extends Thread{
113 113
 		
114 114
 		// callback trigger request in queue
115 115
 		while(triggerQueue !=null && triggerQueue.size()>0){
116
-			RequestModel triggerDate = triggerQueue.poll();
117
-			if (triggerDate!=null) {
116
+			TriggerParam triggerParam = triggerQueue.poll();
117
+			if (triggerParam!=null) {
118 118
 				// is killed
119
-				triggerDate.setStatus(ResponseModel.FAIL);
120
-				triggerDate.setMsg(stopReason + " [任务尚未执行,在调度队列中被终止]");
121
-				TriggerCallbackThread.pushCallBack(triggerDate);
119
+				triggerParam.setStatus(ReturnT.FAIL_CODE+"");
120
+				triggerParam.setMsg(stopReason + " [任务尚未执行,在调度队列中被终止]");
121
+				TriggerCallbackThread.pushCallBack(triggerParam);
122 122
 			}
123 123
 		}
124 124
 		

xxl-job-core/src/main/java/com/xxl/job/core/router/thread/TriggerCallbackThread.java → xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java Vedi File

@@ -1,8 +1,9 @@
1
-package com.xxl.job.core.router.thread;
1
+package com.xxl.job.core.thread;
2 2
 
3
-import com.xxl.job.core.router.model.RequestModel;
4
-import com.xxl.job.core.router.model.ResponseModel;
5
-import com.xxl.job.core.util.XxlJobNetCommUtil;
3
+import com.xxl.job.core.biz.AdminBiz;
4
+import com.xxl.job.core.biz.model.ReturnT;
5
+import com.xxl.job.core.biz.model.TriggerParam;
6
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
6 7
 import org.slf4j.Logger;
7 8
 import org.slf4j.LoggerFactory;
8 9
 
@@ -14,20 +15,24 @@ import java.util.concurrent.LinkedBlockingQueue;
14 15
 public class TriggerCallbackThread {
15 16
     private static Logger logger = LoggerFactory.getLogger(TriggerCallbackThread.class);
16 17
 
17
-    private static LinkedBlockingQueue<RequestModel> callBackQueue = new LinkedBlockingQueue<RequestModel>();
18
+    private static LinkedBlockingQueue<TriggerParam> callBackQueue = new LinkedBlockingQueue<TriggerParam>();
18 19
     static {
19 20
         new Thread(new Runnable() {
20 21
             @Override
21 22
             public void run() {
22 23
                 while(true){
23 24
                     try {
24
-                        RequestModel callback = callBackQueue.take();
25
+                        TriggerParam callback = callBackQueue.take();
25 26
                         if (callback != null) {
26 27
                             for (String address : callback.getLogAddress()) {
27 28
                                 try {
28
-                                    ResponseModel responseModel = XxlJobNetCommUtil.postHex(XxlJobNetCommUtil.addressToUrl(address), callback);
29
-                                    logger.info(">>>>>>>>>>> xxl-job callback , RequestModel:{}, ResponseModel:{}", new Object[]{callback.toString(), responseModel.toString()});
30
-                                    if (ResponseModel.SUCCESS.equals(responseModel.getStatus())) {
29
+
30
+                                    // callback
31
+                                    AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, address).getObject();
32
+                                    ReturnT<String> callbackResult = adminBiz.callback(callback);
33
+
34
+                                    logger.info(">>>>>>>>>>> xxl-job callback , CallbackParam:{}, callbackResult:{}", new Object[]{callback.toString(), callbackResult.toString()});
35
+                                    if (ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
31 36
                                         break;
32 37
                                     }
33 38
                                 } catch (Exception e) {
@@ -42,7 +47,7 @@ public class TriggerCallbackThread {
42 47
             }
43 48
         }).start();
44 49
     }
45
-    public static void pushCallBack(RequestModel callback){
50
+    public static void pushCallBack(TriggerParam callback){
46 51
         callBackQueue.add(callback);
47 52
         logger.debug(">>>>>>>>>>> xxl-job, push callback request, logId:{}", callback.getLogId());
48 53
     }

+ 0 - 90
xxl-job-core/src/main/java/com/xxl/job/core/util/ByteHexConverter.java Vedi File

@@ -1,90 +0,0 @@
1
-package com.xxl.job.core.util;
2
-
3
-import org.slf4j.Logger;
4
-import org.slf4j.LoggerFactory;
5
-
6
-import java.io.UnsupportedEncodingException;
7
-import java.math.BigInteger;
8
-
9
-/**
10
- * hex/byte util
11
- * @author xuxueli 2015-11-14 22:47:28
12
- */
13
-public class ByteHexConverter {
14
-	private static Logger logger = LoggerFactory.getLogger(ByteHexConverter.class);
15
-
16
-	/**
17
-	 * byte - to - radix, use BigInteger
18
-	 */
19
-	private static final String hex_tables = "0123456789ABCDEF";
20
-	public static String byte2hex (byte[] iBytes) {
21
-		StringBuilder hex = new StringBuilder(iBytes.length * 2);
22
-		for (int index = 0; index < iBytes.length; index++) {
23
-			hex.append(hex_tables.charAt((iBytes[index] & 0xf0) >> 4));
24
-			hex.append(hex_tables.charAt((iBytes[index] & 0x0f) >> 0));
25
-		}		
26
-		return hex.toString();
27
-	}
28
-	public static byte[] hex2Byte(String hexString) {
29
-		if (hexString == null || hexString.equals("")) {  
30
-	        return null;  
31
-	    }
32
-		byte[] res = new byte[hexString.length() / 2];
33
-		char[] chs = hexString.toCharArray();
34
-		for (int i = 0, c = 0; i < chs.length; i += 2, c++) {
35
-			res[c] = (byte) (Integer.parseInt(new String(chs, i, 2), 16));
36
-		}
37
-		return res;
38
-	}
39
-	
40
-	/**
41
-	 * byte - to - radix, use BigInteger
42
-	 */
43
-	public static final int HEX = 16;
44
-	public static String byte2radix(byte[] iBytes, int radix){
45
-		return new BigInteger(1, iBytes).toString(radix);
46
-	}
47
-	public static byte[] radix2byte(String val, int radix){
48
-		return new BigInteger(val, radix).toByteArray();
49
-	}
50
-
51
-	/**
52
-	 * get length of string
53
-	 * @param str
54
-	 * @return len of string byte
55
-	 */
56
-	public static int getByteLen(String str){
57
-		if (str==null || str.length()==0) {
58
-			return 0;
59
-		}
60
-		// because java base on unicode, and one china code's length is one, but it's cost 2 bytes.
61
-		//int len = str.getBytes().length * 2;
62
-		int len = 0;
63
-		try {
64
-			len = str.getBytes("UTF-8").length;
65
-		} catch (UnsupportedEncodingException e) {
66
-			logger.error("", e);
67
-			len = str.getBytes().length * 2;
68
-		}
69
-
70
-		if (len % 4 != 0) {
71
-			// Length is best in multiples of four
72
-			len = (len/4 + 1) * 4;
73
-		}
74
-		return len;
75
-	}
76
-
77
-	public static void main(String[] args) {
78
-		// hex - byte[] 方案A:位移
79
-		String temp = "1111111111113d1f3a51sd3f1a32sd1f32as1df2a13sd21f3a2s1df32a13sd2f123s2a3d13fa13sd9999999999";
80
-		System.out.println("明文:" + new String(temp.getBytes()));
81
-		System.out.println("编码:" + byte2hex(temp.getBytes()));
82
-		System.out.println("解码:" + new String(hex2Byte(byte2hex(temp.getBytes()))));
83
-		
84
-		// hex - byte[] 方案B:BigInteger
85
-		System.out.println("编码:" + byte2radix(temp.getBytes(), HEX));
86
-		System.out.println("解码:" + new String(radix2byte(byte2radix(temp.getBytes(), HEX), HEX)));
87
-
88
-	}
89
-	
90
-}

+ 0 - 98
xxl-job-core/src/main/java/com/xxl/job/core/util/ByteReadFactory.java Vedi File

@@ -1,98 +0,0 @@
1
-package com.xxl.job.core.util;
2
-
3
-import org.slf4j.Logger;
4
-import org.slf4j.LoggerFactory;
5
-
6
-import java.io.UnsupportedEncodingException;
7
-
8
-/**
9
- * byte read util
10
- * @author xuxueli 2015-11-15 03:50:10
11
- */
12
-public class ByteReadFactory {
13
-	private static transient Logger logger = LoggerFactory.getLogger(ByteReadFactory.class);
14
-	private int m_iPos;
15
-	private int m_iReqLen;
16
-	private byte[] m_byte = null;
17
-
18
-	public ByteReadFactory(byte[] hexBytes){
19
-		m_iPos = 0;
20
-		m_byte = hexBytes;
21
-		m_iReqLen = m_byte.length;
22
-	}
23
-	
24
-	public int readInt() {
25
-		if (m_iPos + 4 > m_iReqLen) {
26
-			return 0;
27
-		}
28
-		int iInt = (m_byte[m_iPos] & 0xff) 
29
-				| ((m_byte[m_iPos + 1] & 0xff) << 8)
30
-				| ((m_byte[m_iPos + 2] & 0xff) << 16)
31
-				| ((m_byte[m_iPos + 3] & 0xff) << 24);		
32
-		m_iPos += 4;
33
-		return iInt;
34
-	}
35
-	
36
-	public long readLong() {
37
-		if (m_iPos + 8 > m_iReqLen) {
38
-			return 0;
39
-		}
40
-		long iLong = (m_byte[m_iPos] & 0xff) 
41
-				| ((m_byte[m_iPos + 1] & 0xff) << 8)
42
-				| ((m_byte[m_iPos + 2] & 0xff) << 16)
43
-				| ((m_byte[m_iPos + 3] & 0xff) << 24)
44
-				| ((m_byte[m_iPos + 4] & 0xff) << 32)
45
-				| ((m_byte[m_iPos + 5] & 0xff) << 40)
46
-				| ((m_byte[m_iPos + 6] & 0xff) << 48)
47
-				| ((m_byte[m_iPos + 7] & 0xff) << 56);
48
-		m_iPos += 8;
49
-		return iLong;
50
-	}
51
-	
52
-	public String readString(int length) {
53
-		if (m_iPos + length > m_iReqLen) {
54
-			logger.error("[byte stream factory read string length error.]");
55
-			return "";
56
-		}
57
-		
58
-		int index = 0;
59
-		for (index = 0; index < length; index++) {
60
-			if (m_byte[m_iPos + index] == 0) {
61
-				break;
62
-			}
63
-		}
64
-		String msg = "";
65
-		try {
66
-			msg = new String(m_byte, m_iPos, index, "UTF-8");
67
-		} catch (UnsupportedEncodingException e) {
68
-			logger.error("[byte stream factory read string exception.]", e);
69
-		}
70
-		m_iPos += length;
71
-		
72
-		return msg;
73
-	}
74
-	
75
-	public byte[] read(int length) {
76
-		if (m_iPos + length > m_iReqLen || length<=0) {
77
-			logger.error("[byte stream factory read string length error.]");
78
-			return null;
79
-		}
80
-		for (int i = 0; i < length; i++) {
81
-			if (m_byte[m_iPos + i] == 0) {
82
-				break;
83
-			}
84
-		}
85
-		
86
-		byte[] result = new byte[length];
87
-		for (int i = 0; i < length; i++) {
88
-			result[i] = m_byte[m_iPos + i];
89
-		}
90
-		m_iPos += length;
91
-		return result;
92
-	}
93
-	
94
-	public byte[] readByteAll() {
95
-		return read(m_iReqLen - m_iPos);
96
-	}
97
-	
98
-}

+ 0 - 67
xxl-job-core/src/main/java/com/xxl/job/core/util/ByteWriteFactory.java Vedi File

@@ -1,67 +0,0 @@
1
-package com.xxl.job.core.util;
2
-
3
-import org.slf4j.Logger;
4
-import org.slf4j.LoggerFactory;
5
-
6
-import java.io.UnsupportedEncodingException;
7
-import java.nio.ByteBuffer;
8
-
9
-/**
10
- * byte write util
11
- * @author xuxueli 2015-11-15 03:49:36
12
- */
13
-public class ByteWriteFactory {
14
-	private static transient Logger logger = LoggerFactory.getLogger(ByteWriteFactory.class);
15
-	private ByteBuffer m_byteBuf = null;	
16
-	public ByteWriteFactory() {
17
-		m_byteBuf = ByteBuffer.allocate(1024 * 4);
18
-	}
19
-	public ByteWriteFactory(int capacity) {
20
-		m_byteBuf = ByteBuffer.allocate(capacity);
21
-	}
22
-	
23
-	public void writeInt(int intValue) {
24
-		byte[] intBytes = new byte[4];
25
-		for (int index = 0; index < 4; index++) {
26
-			intBytes[index] = (byte) (intValue >>> (index * 8));
27
-		}
28
-		m_byteBuf.put(intBytes);
29
-	}
30
-	
31
-	public void write(int[] intArr) {
32
-		for (int index = 0; index < intArr.length; index++) {
33
-			writeInt(intArr[index]);
34
-		}
35
-	}
36
-	
37
-	public void write(byte[] byteArr) {
38
-		m_byteBuf.put(byteArr);
39
-	}
40
-	
41
-	public void writeString(String value, int length) {
42
-		byte[] bytes = new byte[length];
43
-		if (value != null && value.trim().length() > 0) {
44
-			try {
45
-				byte[] infoBytes = value.getBytes("UTF-8");
46
-				int len = infoBytes.length < length ? infoBytes.length : length;			
47
-				System.arraycopy(infoBytes, 0, bytes, 0, len);
48
-			} catch (UnsupportedEncodingException e) {
49
-				logger.error("[response stream factory encoding exception.]", e);
50
-			}
51
-		}	
52
-		m_byteBuf.put(bytes);	
53
-	}
54
-	
55
-	public byte[] getBytes() {
56
-		m_byteBuf.flip();
57
-		if (m_byteBuf.limit() == 0) {
58
-			return null;
59
-		}
60
-		
61
-		byte[] bytes = new byte[m_byteBuf.limit()];
62
-		m_byteBuf.get(bytes);
63
-		
64
-		return bytes;
65
-	}
66
-	
67
-}

+ 92 - 0
xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java Vedi File

@@ -0,0 +1,92 @@
1
+package com.xxl.job.core.util;
2
+
3
+import org.apache.http.HttpEntity;
4
+import org.apache.http.HttpResponse;
5
+import org.apache.http.client.methods.HttpPost;
6
+import org.apache.http.entity.ByteArrayEntity;
7
+import org.apache.http.entity.ContentType;
8
+import org.apache.http.impl.client.CloseableHttpClient;
9
+import org.apache.http.impl.client.HttpClients;
10
+import org.apache.http.util.EntityUtils;
11
+
12
+import javax.servlet.http.HttpServletRequest;
13
+import java.io.IOException;
14
+import java.io.InputStream;
15
+
16
+/**
17
+ * httpclient util
18
+ * @author xuxueli 2015-10-31 19:50:41
19
+ */
20
+public class HttpClientUtil {
21
+
22
+	/**
23
+	 * post request
24
+	 */
25
+	public static byte[] postRequest(String reqURL, byte[] date) {
26
+		byte[] responseBytes = null;
27
+		
28
+		HttpPost httpPost = new HttpPost(reqURL);
29
+		CloseableHttpClient httpClient = HttpClients.createDefault();
30
+		try {
31
+			// init post
32
+			/*if (params != null && !params.isEmpty()) {
33
+				List<NameValuePair> formParams = new ArrayList<NameValuePair>();
34
+				for (Map.Entry<String, String> entry : params.entrySet()) {
35
+					formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
36
+				}
37
+				httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8"));
38
+			}*/
39
+			if (date != null) {
40
+				httpPost.setEntity(new ByteArrayEntity(date, ContentType.DEFAULT_BINARY));
41
+			}
42
+			// do post
43
+			HttpResponse response = httpClient.execute(httpPost);
44
+			HttpEntity entity = response.getEntity();
45
+			if (null != entity) {
46
+				responseBytes = EntityUtils.toByteArray(entity);
47
+				EntityUtils.consume(entity);
48
+			}
49
+		} catch (Exception e) {
50
+			e.printStackTrace();
51
+		} finally {
52
+			httpPost.releaseConnection();
53
+			try {
54
+				httpClient.close();
55
+			} catch (IOException e) {
56
+				e.printStackTrace();
57
+			}
58
+		}
59
+		return responseBytes;
60
+	}
61
+	
62
+	/**
63
+	 * read bytes from http request
64
+	 * @param request
65
+	 * @return
66
+	 * @throws IOException 
67
+	 */
68
+	public static final byte[] readBytes(HttpServletRequest request) throws IOException {
69
+		request.setCharacterEncoding("UTF-8");
70
+        int contentLen = request.getContentLength();
71
+		InputStream is = request.getInputStream();
72
+		if (contentLen > 0) {
73
+			int readLen = 0;
74
+			int readLengthThisTime = 0;
75
+			byte[] message = new byte[contentLen];
76
+			try {
77
+				while (readLen != contentLen) {
78
+					readLengthThisTime = is.read(message, readLen, contentLen - readLen);
79
+					if (readLengthThisTime == -1) {
80
+						break;
81
+					}
82
+					readLen += readLengthThisTime;
83
+				}
84
+				return message;
85
+			} catch (IOException e) {
86
+				e.printStackTrace();
87
+			}
88
+		}
89
+		return new byte[] {};
90
+	}
91
+	
92
+}

+ 0 - 170
xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobNetCommUtil.java Vedi File

@@ -1,170 +0,0 @@
1
-package com.xxl.job.core.util;
2
-
3
-import com.xxl.job.core.router.model.RequestModel;
4
-import com.xxl.job.core.router.model.ResponseModel;
5
-import org.apache.http.HttpEntity;
6
-import org.apache.http.HttpResponse;
7
-import org.apache.http.NameValuePair;
8
-import org.apache.http.client.config.RequestConfig;
9
-import org.apache.http.client.entity.UrlEncodedFormEntity;
10
-import org.apache.http.client.methods.HttpPost;
11
-import org.apache.http.impl.client.CloseableHttpClient;
12
-import org.apache.http.impl.client.HttpClients;
13
-import org.apache.http.message.BasicNameValuePair;
14
-import org.apache.http.util.EntityUtils;
15
-import org.slf4j.Logger;
16
-import org.slf4j.LoggerFactory;
17
-
18
-import java.io.IOException;
19
-import java.util.ArrayList;
20
-import java.util.List;
21
-
22
-/**
23
- * http util to send data
24
- * @author xuxueli
25
- * @version  2015-11-28 15:30:59
26
- */
27
-public class XxlJobNetCommUtil {
28
-	private static Logger logger = LoggerFactory.getLogger(XxlJobNetCommUtil.class);
29
-
30
-    // hex param key
31
-    public static final String HEX = "hex";
32
-
33
-
34
-    /**
35
-     * format object to hex-json
36
-     * @param obj
37
-     * @return result
38
-     */
39
-    public static String formatObj2HexJson(Object obj){
40
-    	// obj to json
41
-        String json = JacksonUtil.writeValueAsString(obj);
42
-		int len = ByteHexConverter.getByteLen(json);
43
-
44
-		// json to byte[]
45
-		ByteWriteFactory byteWriteFactory = new ByteWriteFactory(4 + len);
46
-		byteWriteFactory.writeInt(len);
47
-		byteWriteFactory.writeString(json, len);
48
-		byte[] bytes = byteWriteFactory.getBytes();
49
-
50
-		// byte to hex
51
-        String hex = ByteHexConverter.byte2hex(bytes);
52
-        return hex;
53
-    }
54
-
55
-    /**
56
-     * parse hex-json to object
57
-     * @param hex
58
-     * @param clazz
59
-     * @return result
60
-     */
61
-    public static <T> T parseHexJson2Obj(String hex, Class<T> clazz){
62
-    	// hex to byte[]
63
-    	byte[] bytes = ByteHexConverter.hex2Byte(hex);
64
-
65
-		// byte[] to json
66
-		ByteReadFactory byteReadFactory = new ByteReadFactory(bytes);
67
-		String json = byteReadFactory.readString(byteReadFactory.readInt());
68
-
69
-		// json to obj
70
-        T obj = JacksonUtil.readValue(json, clazz);
71
-        return obj;
72
-    }
73
-
74
-    public static void main(String[] args) {
75
-		RequestModel requestModel = new RequestModel();
76
-		requestModel.setJobGroup("group");
77
-
78
-		String hex = formatObj2HexJson(requestModel);
79
-		System.out.println(hex);
80
-        System.out.println(parseHexJson2Obj(hex, RequestModel.class));
81
-    }
82
-
83
-	/**
84
-	 * http post request
85
-	 * @param reqURL
86
-	 */
87
-	public static ResponseModel postHex(String reqURL, RequestModel requestModel){
88
-
89
-		// parse RequestModel to hex-json
90
-		String requestHex = XxlJobNetCommUtil.formatObj2HexJson(requestModel);
91
-
92
-        // msg
93
-		String failMsg = null;
94
-		
95
-		// do post
96
-		HttpPost httpPost = null;
97
-		CloseableHttpClient httpClient = null;
98
-		try{
99
-			httpPost = new HttpPost(reqURL);
100
-			List<NameValuePair> formParams = new ArrayList<NameValuePair>();
101
-			formParams.add(new BasicNameValuePair(XxlJobNetCommUtil.HEX, requestHex));
102
-			httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8"));
103
-
104
-
105
-			RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build();
106
-			httpPost.setConfig(requestConfig);
107
-			
108
-			//httpClient = HttpClients.createDefault();	// default retry 3 times
109
-			httpClient = HttpClients.custom().disableAutomaticRetries().build();
110
-
111
-			HttpResponse response = httpClient.execute(httpPost);
112
-			HttpEntity entity = response.getEntity();
113
-			if (response.getStatusLine().getStatusCode() == 200 && null != entity) {
114
-                String responseHex = EntityUtils.toString(entity, "UTF-8");
115
-				logger.debug("xxl-job, net comm success, requestHex:{}, responseHex:{}", requestHex, responseHex);
116
-				EntityUtils.consume(entity);
117
-
118
-                // i do not know why
119
-                //responseHex = responseHex.replace("\n", "");
120
-                //responseHex = responseHex.replace("\r", "");
121
-
122
-				if (responseHex!=null) {
123
-					responseHex = responseHex.trim();
124
-				}
125
-
126
-                // parse hex-json to ResponseModel
127
-                ResponseModel responseModel = XxlJobNetCommUtil.parseHexJson2Obj(responseHex, ResponseModel.class);
128
-
129
-                if (responseModel!=null) {
130
-                    return responseModel;
131
-                }
132
-			} else {
133
-				failMsg = "http statusCode error, statusCode:" + response.getStatusLine().getStatusCode();
134
-			}
135
-		} catch (Exception e) {
136
-            logger.error("", e);
137
-			/*StringWriter out = new StringWriter();
138
-			e.printStackTrace(new PrintWriter(out));
139
-			callback.setMsg(out.toString());*/
140
-			failMsg = e.getMessage();
141
-		} finally{
142
-			if (httpPost!=null) {
143
-				httpPost.releaseConnection();
144
-			}
145
-			if (httpClient!=null) {
146
-				try {
147
-					httpClient.close();
148
-				} catch (IOException e) {
149
-                    logger.error("", e);
150
-				}
151
-			}
152
-		}
153
-
154
-		// other, default fail
155
-		ResponseModel callback = new ResponseModel();
156
-		callback.setStatus(ResponseModel.FAIL);
157
-		callback.setMsg(failMsg);
158
-		return callback;
159
-	}
160
-	
161
-	/**
162
-	 * parse address ip:port to url http://.../ 
163
-	 * @param address
164
-	 * @return result
165
-	 */
166
-	public static String addressToUrl(String address){
167
-		return "http://" + address + "/";
168
-	}
169
-	
170
-}

+ 2 - 2
xxl-job-executor-example/pom.xml Vedi File

@@ -4,13 +4,13 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.6.0</version>
7
+		<version>1.6.0-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-executor-example</artifactId>
10 10
 	<packaging>war</packaging>
11 11
 
12 12
 	<properties>
13
-		<xxl-job.version>1.6.0</xxl-job.version>
13
+		<xxl-job.version>1.6.0-SNAPSHOT</xxl-job.version>
14 14
 		<spring.version>3.2.17.RELEASE</spring.version>
15 15
 	</properties>
16 16
 

+ 1 - 1
xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml Vedi File

@@ -13,7 +13,7 @@
13 13
 	<context:component-scan base-package="com.xxl.job.executor.service.jobhandler" />
14 14
 
15 15
 	<!-- 配置02、执行器 -->
16
-	<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.jetty.XxlJobExecutor" init-method="start" destroy-method="destroy" >
16
+	<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" >
17 17
 		<!-- 执行器IP[选填],为空则自动获取 -->
18 18
 		<!--<property name="ip" value="" />-->
19 19
 		<!-- 执行器端口号 -->