Procházet zdrojové kódy

执行器与数据库彻底解耦,但是执行器需要配置调度中心集群地址。调度中心提供API供执行器回调和心跳注册服务,取消调度中心内部jetty,心跳周期调整为30s,心跳失效为三倍心跳;

xueli.xue před 8 roky
rodič
revize
8a6d462d3b
30 změnil soubory, kde provedl 451 přidání a 251 odebrání
  1. 47 12
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
  2. 3 7
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
  3. 3 19
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
  4. 4 33
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java
  5. 8 14
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
  6. 7 4
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  7. 0 4
      xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml
  8. 1 1
      xxl-job-admin/src/main/resources/spring/springmvc-context.xml
  9. 0 4
      xxl-job-admin/src/main/resources/xxl-job-admin.properties
  10. 0 2
      xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl
  11. 23 0
      xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminApiTest.java
  12. 0 13
      xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java
  13. 10 13
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/HandleCallbackParam.java
  14. 54 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/RegistryParam.java
  15. 2 1
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/ReturnT.java
  16. 13 9
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
  17. 13 0
      xxl-job-core/src/main/java/com/xxl/job/core/enums/RegistryConfig.java
  18. 4 5
      xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
  19. 0 13
      xxl-job-core/src/main/java/com/xxl/job/core/registry/RegistHelper.java
  20. 0 28
      xxl-job-core/src/main/java/com/xxl/job/core/registry/impl/DbRegistHelper.java
  21. 2 3
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java
  22. 2 3
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java
  23. 29 14
      xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java
  24. 3 3
      xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
  25. 7 15
      xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java
  26. 116 0
      xxl-job-core/src/main/java/com/xxl/job/core/util/AdminApiUtil.java
  27. 1 1
      xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java
  28. 93 0
      xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java
  29. 4 25
      xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml
  30. 2 5
      xxl-job-executor-example/src/main/resources/xxl-job-executor.properties

xxl-job-admin/src/main/java/com/xxl/job/admin/core/biz/AdminBizImpl.java → xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java Zobrazit soubor

@@ -1,30 +1,53 @@
1
-package com.xxl.job.admin.core.biz;
1
+package com.xxl.job.admin.controller;
2 2
 
3
+import com.xxl.job.admin.controller.annotation.PermessionLimit;
3 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4 5
 import com.xxl.job.admin.core.model.XxlJobLog;
5 6
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6
-import com.xxl.job.core.biz.AdminBiz;
7
+import com.xxl.job.admin.dao.IXxlJobInfoDao;
8
+import com.xxl.job.admin.dao.IXxlJobLogDao;
9
+import com.xxl.job.admin.dao.IXxlJobRegistryDao;
7 10
 import com.xxl.job.core.biz.model.HandleCallbackParam;
11
+import com.xxl.job.core.biz.model.RegistryParam;
8 12
 import com.xxl.job.core.biz.model.ReturnT;
13
+import com.xxl.job.core.util.AdminApiUtil;
9 14
 import org.apache.commons.lang.StringUtils;
10 15
 import org.quartz.SchedulerException;
11 16
 import org.slf4j.Logger;
12 17
 import org.slf4j.LoggerFactory;
18
+import org.springframework.stereotype.Controller;
19
+import org.springframework.web.bind.annotation.RequestBody;
20
+import org.springframework.web.bind.annotation.RequestMapping;
21
+import org.springframework.web.bind.annotation.RequestMethod;
22
+import org.springframework.web.bind.annotation.ResponseBody;
13 23
 
24
+import javax.annotation.Resource;
14 25
 import java.text.MessageFormat;
15 26
 import java.util.Date;
16 27
 
17 28
 /**
18
- * Created by xuxueli on 17/3/1.
29
+ * Created by xuxueli on 17/5/10.
19 30
  */
20
-public class AdminBizImpl implements AdminBiz {
21
-    private static Logger logger = LoggerFactory.getLogger(AdminBizImpl.class);
31
+@Controller
32
+public class JobApiController {
33
+    private static Logger logger = LoggerFactory.getLogger(JobApiController.class);
34
+
35
+    @Resource
36
+    public IXxlJobLogDao xxlJobLogDao;
37
+    @Resource
38
+    private IXxlJobInfoDao xxlJobInfoDao;
39
+    @Resource
40
+    private IXxlJobRegistryDao xxlJobRegistryDao;
41
+
42
+
43
+    @RequestMapping(value= AdminApiUtil.CALLBACK, method = RequestMethod.POST, consumes = "application/json")
44
+    @ResponseBody
45
+    @PermessionLimit(limit=false)
46
+    public ReturnT<String> callback(@RequestBody HandleCallbackParam handleCallbackParam){
22 47
 
23
-    @Override
24
-    public ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {
25 48
 
26 49
         // valid log item
27
-        XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(handleCallbackParam.getLogId());
50
+        XxlJobLog log = xxlJobLogDao.load(handleCallbackParam.getLogId());
28 51
         if (log == null) {
29 52
             return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
30 53
         }
@@ -32,14 +55,14 @@ public class AdminBizImpl implements AdminBiz {
32 55
         // trigger success, to trigger child job, and avoid repeat trigger child job
33 56
         String childTriggerMsg = null;
34 57
         if (ReturnT.SUCCESS_CODE==handleCallbackParam.getExecuteResult().getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) {
35
-            XxlJobInfo xxlJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
58
+            XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
36 59
             if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
37 60
                 childTriggerMsg = "<hr>";
38 61
                 String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
39 62
                 for (int i = 0; i < childJobKeys.length; i++) {
40 63
                     String[] jobKeyArr = childJobKeys[i].split("_");
41 64
                     if (jobKeyArr!=null && jobKeyArr.length==2) {
42
-                        XxlJobInfo childJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
65
+                        XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
43 66
                         if (childJobInfo!=null) {
44 67
                             try {
45 68
                                 boolean ret = XxlJobDynamicScheduler.triggerJob(String.valueOf(childJobInfo.getId()), String.valueOf(childJobInfo.getJobGroup()));
@@ -79,9 +102,21 @@ public class AdminBizImpl implements AdminBiz {
79 102
         log.setHandleTime(new Date());
80 103
         log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
81 104
         log.setHandleMsg(handleMsg.toString());
82
-        XxlJobDynamicScheduler.xxlJobLogDao.updateHandleInfo(log);
105
+        xxlJobLogDao.updateHandleInfo(log);
83 106
 
84
-        return new ReturnT<String>(ReturnT.SUCCESS_CODE, null);
107
+        return ReturnT.SUCCESS;
108
+    }
109
+
110
+
111
+    @RequestMapping(value=AdminApiUtil.REGISTRY, method = RequestMethod.POST, consumes = "application/json")
112
+    @ResponseBody
113
+    @PermessionLimit(limit=false)
114
+    public ReturnT<String> registry(@RequestBody RegistryParam registryParam){
115
+        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
116
+        if (ret < 1) {
117
+            xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
118
+        }
119
+        return ReturnT.SUCCESS;
85 120
     }
86 121
 
87 122
 }

+ 3 - 7
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Zobrazit soubor

@@ -1,11 +1,11 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
4
+import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
5 5
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
6 6
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
7 7
 import com.xxl.job.core.biz.model.ReturnT;
8
-import com.xxl.job.core.registry.RegistHelper;
8
+import com.xxl.job.core.enums.RegistryConfig;
9 9
 import org.apache.commons.collections.CollectionUtils;
10 10
 import org.apache.commons.lang.StringUtils;
11 11
 import org.springframework.stereotype.Controller;
@@ -33,9 +33,6 @@ public class JobGroupController {
33 33
 	@RequestMapping
34 34
 	public String index(Model model) {
35 35
 
36
-		// job admin
37
-		List<String> adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name());
38
-
39 36
 		// job group (executor)
40 37
 		List<XxlJobGroup> list = xxlJobGroupDao.findAll();
41 38
 
@@ -43,7 +40,7 @@ public class JobGroupController {
43 40
 			for (XxlJobGroup group: list) {
44 41
 				List<String> registryList = null;
45 42
 				if (group.getAddressType() == 0) {
46
-					registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
43
+					registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
47 44
 				} else {
48 45
 					if (StringUtils.isNotBlank(group.getAddressList())) {
49 46
 						registryList = Arrays.asList(group.getAddressList().split(","));
@@ -53,7 +50,6 @@ public class JobGroupController {
53 50
 			}
54 51
 		}
55 52
 
56
-		model.addAttribute("adminAddressList", adminAddressList);
57 53
 		model.addAttribute("list", list);
58 54
 		return "jobgroup/jobgroup.index";
59 55
 	}

+ 3 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Zobrazit soubor

@@ -7,12 +7,12 @@ import com.xxl.job.admin.core.model.XxlJobLog;
7 7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8 8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
9 9
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
10
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
10
+import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
11 11
 import com.xxl.job.core.biz.ExecutorBiz;
12 12
 import com.xxl.job.core.biz.model.ReturnT;
13 13
 import com.xxl.job.core.biz.model.TriggerParam;
14 14
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
15
-import com.xxl.job.core.registry.RegistHelper;
15
+import com.xxl.job.core.enums.RegistryConfig;
16 16
 import com.xxl.job.core.rpc.netcom.NetComClientProxy;
17 17
 import org.apache.commons.collections.CollectionUtils;
18 18
 import org.apache.commons.lang.StringUtils;
@@ -68,7 +68,6 @@ public class RemoteHttpJobBean extends QuartzJobBean {
68 68
 		triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());
69 69
 		triggerParam.setLogId(jobLog.getId());
70 70
 		triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
71
-		triggerParam.setLogAddress(findCallbackAddressList());		// callback address list
72 71
 
73 72
 		// do trigger
74 73
 		ReturnT<String> triggerResult = doTrigger(triggerParam, jobInfo, jobLog);
@@ -100,7 +99,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
100 99
 		XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
101 100
 		if (group.getAddressType() == 0) {
102 101
 			triggerSb.append("注册方式:自动注册");
103
-			addressList = (ArrayList<String>) JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
102
+			addressList = (ArrayList<String>) JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
104 103
 		} else {
105 104
 			triggerSb.append("注册方式:手动录入");
106 105
 			if (StringUtils.isNotBlank(group.getAddressList())) {
@@ -212,19 +211,4 @@ public class RemoteHttpJobBean extends QuartzJobBean {
212 211
 		return runResult;
213 212
 	}
214 213
 
215
-	/**
216
-	 * find callback address list
217
-	 * @return
218
-	 */
219
-	public Set<String> findCallbackAddressList(){
220
-		Set<String> adminAddressSet = new HashSet<String>();
221
-		adminAddressSet.add(XxlJobDynamicScheduler.getCallbackAddress());
222
-
223
-		List<String> adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name());
224
-		if (adminAddressList!=null) {
225
-			adminAddressSet.addAll(adminAddressList);
226
-		}
227
-		return adminAddressSet;
228
-	}
229
-
230 214
 }

+ 4 - 33
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java Zobrazit soubor

@@ -3,15 +3,12 @@ package com.xxl.job.admin.core.schedule;
3 3
 import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.thread.JobMonitorHelper;
6
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
6
+import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
7 7
 import com.xxl.job.admin.dao.IXxlJobGroupDao;
8 8
 import com.xxl.job.admin.dao.IXxlJobInfoDao;
9 9
 import com.xxl.job.admin.dao.IXxlJobLogDao;
10 10
 import com.xxl.job.admin.dao.IXxlJobRegistryDao;
11
-import com.xxl.job.core.biz.AdminBiz;
12
-import com.xxl.job.admin.core.biz.AdminBizImpl;
13 11
 import com.xxl.job.core.rpc.netcom.NetComServerFactory;
14
-import com.xxl.job.core.util.IpUtil;
15 12
 import org.quartz.*;
16 13
 import org.quartz.Trigger.TriggerState;
17 14
 import org.quartz.impl.matchers.GroupMatcher;
@@ -39,37 +36,11 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
39 36
 		XxlJobDynamicScheduler.scheduler = scheduler;
40 37
 	}
41 38
     
42
-    // trigger callback address
43
-    private String callBackIp;
44
-    private int callBackPort = 8888;
45
-    private static String callbackAddress;
46
-
47
-    public void setCallBackIp(String callBackIp) {
48
-        this.callBackIp = callBackIp;
49
-    }
50
-    public void setCallBackPort(int callBackPort) {
51
-		this.callBackPort = callBackPort;
52
-	}
53
-    public static String getCallbackAddress(){
54
-        return callbackAddress;
55
-    }
56
-
57 39
     // init
58 40
     private NetComServerFactory serverFactory = new NetComServerFactory();
59 41
     public void init() throws Exception {
60
-        // server
61
-        NetComServerFactory.putService(AdminBiz.class, new AdminBizImpl());
62
-        serverFactory.start(callBackPort, callBackIp, null, null);
63
-
64
-		// init callbackAddress
65
-        if (callBackIp!=null && callBackIp.trim().length()>0) {
66
-            callbackAddress = callBackIp.trim().concat(":").concat(String.valueOf(callBackPort));
67
-        } else {
68
-            callbackAddress = IpUtil.getIpPort(callBackPort);;
69
-        }
70
-
71
-		// admin registry run
72
-        JobRegistryHelper.getInstance().start();
42
+		// admin registry monitor run
43
+        JobRegistryMonitorHelper.getInstance().start();
73 44
 
74 45
         // admin monitor run
75 46
         JobMonitorHelper.getInstance().start();
@@ -78,7 +49,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
78 49
     // destroy
79 50
     public void destroy(){
80 51
         // admin registry stop
81
-        JobRegistryHelper.getInstance().toStop();
52
+        JobRegistryMonitorHelper.getInstance().toStop();
82 53
 
83 54
         // admin monitor stop
84 55
         JobMonitorHelper.getInstance().toStop();

xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java → xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java Zobrazit soubor

@@ -2,7 +2,7 @@ package com.xxl.job.admin.core.thread;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobRegistry;
4 4
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5
-import com.xxl.job.core.registry.RegistHelper;
5
+import com.xxl.job.core.enums.RegistryConfig;
6 6
 import org.slf4j.Logger;
7 7
 import org.slf4j.LoggerFactory;
8 8
 
@@ -15,11 +15,11 @@ import java.util.concurrent.TimeUnit;
15 15
  * job registry instance
16 16
  * @author xuxueli 2016-10-02 19:10:24
17 17
  */
18
-public class JobRegistryHelper {
19
-	private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
18
+public class JobRegistryMonitorHelper {
19
+	private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);
20 20
 
21
-	private static JobRegistryHelper instance = new JobRegistryHelper();
22
-	public static JobRegistryHelper getInstance(){
21
+	private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper();
22
+	public static JobRegistryMonitorHelper getInstance(){
23 23
 		return instance;
24 24
 	}
25 25
 
@@ -33,18 +33,12 @@ public class JobRegistryHelper {
33 33
 			public void run() {
34 34
 				while (!toStop) {
35 35
 					try {
36
-                        // registry admin
37
-                        int ret = XxlJobDynamicScheduler.xxlJobRegistryDao.registryUpdate(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
38
-                        if (ret < 1) {
39
-                            XxlJobDynamicScheduler.xxlJobRegistryDao.registrySave(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
40
-                        }
41
-
42 36
                         // remove dead admin/executor
43
-						XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistHelper.TIMEOUT*2);
37
+						XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistryConfig.DEAD_TIMEOUT);
44 38
 
45 39
                         // fresh registry map
46 40
 						ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
47
-						List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistHelper.TIMEOUT*2);
41
+						List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
48 42
 						if (list != null) {
49 43
 							for (XxlJobRegistry item: list) {
50 44
 								String groupKey = makeGroupKey(item.getRegistryGroup(), item.getRegistryKey());
@@ -61,7 +55,7 @@ public class JobRegistryHelper {
61 55
 						logger.error("job registry instance error:{}", e);
62 56
 					}
63 57
 					try {
64
-						TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
58
+						TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
65 59
 					} catch (InterruptedException e) {
66 60
 						logger.error("job registry instance error:{}", e);
67 61
 					}

+ 7 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Zobrazit soubor

@@ -5,13 +5,16 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
5 5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6 6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
7 7
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
8
-import com.xxl.job.admin.core.thread.JobRegistryHelper;
9
-import com.xxl.job.admin.dao.*;
8
+import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
9
+import com.xxl.job.admin.dao.IXxlJobGroupDao;
10
+import com.xxl.job.admin.dao.IXxlJobInfoDao;
11
+import com.xxl.job.admin.dao.IXxlJobLogDao;
12
+import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
10 13
 import com.xxl.job.admin.service.IXxlJobService;
11 14
 import com.xxl.job.core.biz.model.ReturnT;
12 15
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
16
+import com.xxl.job.core.enums.RegistryConfig;
13 17
 import com.xxl.job.core.glue.GlueTypeEnum;
14
-import com.xxl.job.core.registry.RegistHelper;
15 18
 import org.apache.commons.collections.CollectionUtils;
16 19
 import org.apache.commons.lang.StringUtils;
17 20
 import org.apache.commons.lang.time.DateUtils;
@@ -289,7 +292,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
289 292
 			for (XxlJobGroup group: groupList) {
290 293
 				List<String> registryList = null;
291 294
 				if (group.getAddressType() == 0) {
292
-					registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
295
+					registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
293 296
 				} else {
294 297
 					if (StringUtils.isNotBlank(group.getAddressList())) {
295 298
 						registryList = Arrays.asList(group.getAddressList().split(","));

+ 0 - 4
xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml Zobrazit soubor

@@ -84,10 +84,6 @@
84 84
 	<bean id="xxlJobDynamicScheduler" class="com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler" init-method="init" destroy-method="destroy" >
85 85
 		<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
86 86
 		<property name="scheduler" ref="quartzScheduler"/>
87
-		<!-- 调度中心回调IP[选填],为空则自动获取 -->
88
-		<property name="callBackIp" value="${xxl.job.callBackIp}"/>
89
-		<!-- 调度中心回调端口号 -->
90
-		<property name="callBackPort" value="${xxl.job.callBackPort}"/>
91 87
 	</bean>
92 88
 	
93 89
 </beans>

+ 1 - 1
xxl-job-admin/src/main/resources/spring/springmvc-context.xml Zobrazit soubor

@@ -10,7 +10,7 @@
10 10
 		http://www.springframework.org/schema/mvc
11 11
 		http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
12 12
 
13
-	<mvc:annotation-driven /> 
13
+	<mvc:annotation-driven />
14 14
 	<context:component-scan base-package="com.xxl.job.admin.controller" />
15 15
 	
16 16
 	<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />

+ 0 - 4
xxl-job-admin/src/main/resources/xxl-job-admin.properties Zobrazit soubor

@@ -4,10 +4,6 @@ xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEnco
4 4
 xxl.job.db.user=root
5 5
 xxl.job.db.password=root_pwd
6 6
 
7
-### xxl-job callback address
8
-xxl.job.callBackIp=
9
-xxl.job.callBackPort=8888
10
-
11 7
 ### xxl-job email
12 8
 xxl.job.mail.host=smtp.163.com
13 9
 xxl.job.mail.port=25

+ 0 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl Zobrazit soubor

@@ -30,8 +30,6 @@
30 30
 			            <div class="box-header">
31 31
 							<h3 class="box-title">执行器列表</h3>&nbsp;&nbsp;
32 32
                             <button class="btn btn-info btn-xs pull-left2 add" >+新增执行器</button>
33
-                            &nbsp;&nbsp;&nbsp;&nbsp;
34
-                            调度中心OnLine机器:<#if adminAddressList?exists><#list adminAddressList as item><span class="badge bg-green">${item}</span></#list></#if>
35 33
 						</div>
36 34
 			            <div class="box-body">
37 35
 			              	<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >

+ 23 - 0
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminApiTest.java Zobrazit soubor

@@ -0,0 +1,23 @@
1
+package com.xxl.job.dao.impl;
2
+
3
+import com.xxl.job.core.biz.model.RegistryParam;
4
+import com.xxl.job.core.biz.model.ReturnT;
5
+import com.xxl.job.core.enums.RegistryConfig;
6
+import com.xxl.job.core.util.AdminApiUtil;
7
+
8
+/**
9
+ * Created by xuxueli on 17/5/10.
10
+ */
11
+public class AdminApiTest {
12
+
13
+    public static void main(String[] args) {
14
+        try {
15
+            RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "aaa", "112312312312");
16
+            ReturnT<String> registryResult = AdminApiUtil.callApi("http://localhost:8080/xxl-job-admin"+AdminApiUtil.REGISTRY, registryParam);
17
+            System.out.println(registryResult);
18
+        } catch (Exception e) {
19
+            e.printStackTrace();
20
+        }
21
+    }
22
+
23
+}

+ 0 - 13
xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java Zobrazit soubor

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

+ 10 - 13
xxl-job-core/src/main/java/com/xxl/job/core/biz/model/HandleCallbackParam.java Zobrazit soubor

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.core.biz.model;
2 2
 
3 3
 import java.io.Serializable;
4
-import java.util.Set;
5 4
 
6 5
 /**
7 6
  * Created by xuxueli on 17/3/2.
@@ -10,13 +9,11 @@ public class HandleCallbackParam implements Serializable {
10 9
     private static final long serialVersionUID = 42L;
11 10
 
12 11
     private int logId;
13
-    private Set<String> logAddress;
14
-
15 12
     private ReturnT<String> executeResult;
16 13
 
17
-    public HandleCallbackParam(int logId, Set<String> logAddress, ReturnT<String> executeResult) {
14
+    public HandleCallbackParam(){}
15
+    public HandleCallbackParam(int logId, ReturnT<String> executeResult) {
18 16
         this.logId = logId;
19
-        this.logAddress = logAddress;
20 17
         this.executeResult = executeResult;
21 18
     }
22 19
 
@@ -28,14 +25,6 @@ public class HandleCallbackParam implements Serializable {
28 25
         this.logId = logId;
29 26
     }
30 27
 
31
-    public Set<String> getLogAddress() {
32
-        return logAddress;
33
-    }
34
-
35
-    public void setLogAddress(Set<String> logAddress) {
36
-        this.logAddress = logAddress;
37
-    }
38
-
39 28
     public ReturnT<String> getExecuteResult() {
40 29
         return executeResult;
41 30
     }
@@ -43,4 +32,12 @@ public class HandleCallbackParam implements Serializable {
43 32
     public void setExecuteResult(ReturnT<String> executeResult) {
44 33
         this.executeResult = executeResult;
45 34
     }
35
+
36
+    @Override
37
+    public String toString() {
38
+        return "HandleCallbackParam{" +
39
+                "logId=" + logId +
40
+                ", executeResult=" + executeResult +
41
+                '}';
42
+    }
46 43
 }

+ 54 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/model/RegistryParam.java Zobrazit soubor

@@ -0,0 +1,54 @@
1
+package com.xxl.job.core.biz.model;
2
+
3
+import java.io.Serializable;
4
+
5
+/**
6
+ * Created by xuxueli on 2017-05-10 20:22:42
7
+ */
8
+public class RegistryParam implements Serializable {
9
+    private static final long serialVersionUID = 42L;
10
+
11
+    private String registGroup;
12
+    private String registryKey;
13
+    private String registryValue;
14
+
15
+    public RegistryParam(){}
16
+    public RegistryParam(String registGroup, String registryKey, String registryValue) {
17
+        this.registGroup = registGroup;
18
+        this.registryKey = registryKey;
19
+        this.registryValue = registryValue;
20
+    }
21
+
22
+    public String getRegistGroup() {
23
+        return registGroup;
24
+    }
25
+
26
+    public void setRegistGroup(String registGroup) {
27
+        this.registGroup = registGroup;
28
+    }
29
+
30
+    public String getRegistryKey() {
31
+        return registryKey;
32
+    }
33
+
34
+    public void setRegistryKey(String registryKey) {
35
+        this.registryKey = registryKey;
36
+    }
37
+
38
+    public String getRegistryValue() {
39
+        return registryValue;
40
+    }
41
+
42
+    public void setRegistryValue(String registryValue) {
43
+        this.registryValue = registryValue;
44
+    }
45
+
46
+    @Override
47
+    public String toString() {
48
+        return "RegistryParam{" +
49
+                "registGroup='" + registGroup + '\'' +
50
+                ", registryKey='" + registryKey + '\'' +
51
+                ", registryValue='" + registryValue + '\'' +
52
+                '}';
53
+    }
54
+}

+ 2 - 1
xxl-job-core/src/main/java/com/xxl/job/core/biz/model/ReturnT.java Zobrazit soubor

@@ -18,7 +18,8 @@ public class ReturnT<T> implements Serializable {
18 18
 	private int code;
19 19
 	private String msg;
20 20
 	private T content;
21
-	
21
+
22
+	public ReturnT(){}
22 23
 	public ReturnT(int code, String msg) {
23 24
 		this.code = code;
24 25
 		this.msg = msg;

+ 13 - 9
xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java Zobrazit soubor

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.core.biz.model;
2 2
 
3 3
 import java.io.Serializable;
4
-import java.util.Set;
5 4
 
6 5
 /**
7 6
  * Created by xuxueli on 16/7/22.
@@ -22,8 +21,6 @@ public class TriggerParam implements Serializable{
22 21
     private int logId;
23 22
     private long logDateTim;
24 23
 
25
-    private Set<String> logAddress;
26
-
27 24
     public int getJobId() {
28 25
         return jobId;
29 26
     }
@@ -96,11 +93,18 @@ public class TriggerParam implements Serializable{
96 93
         this.logDateTim = logDateTim;
97 94
     }
98 95
 
99
-    public Set<String> getLogAddress() {
100
-        return logAddress;
101
-    }
102
-
103
-    public void setLogAddress(Set<String> logAddress) {
104
-        this.logAddress = logAddress;
96
+    @Override
97
+    public String toString() {
98
+        return "TriggerParam{" +
99
+                "jobId=" + jobId +
100
+                ", executorHandler='" + executorHandler + '\'' +
101
+                ", executorParams='" + executorParams + '\'' +
102
+                ", executorBlockStrategy='" + executorBlockStrategy + '\'' +
103
+                ", glueType='" + glueType + '\'' +
104
+                ", glueSource='" + glueSource + '\'' +
105
+                ", glueUpdatetime=" + glueUpdatetime +
106
+                ", logId=" + logId +
107
+                ", logDateTim=" + logDateTim +
108
+                '}';
105 109
     }
106 110
 }

+ 13 - 0
xxl-job-core/src/main/java/com/xxl/job/core/enums/RegistryConfig.java Zobrazit soubor

@@ -0,0 +1,13 @@
1
+package com.xxl.job.core.enums;
2
+
3
+/**
4
+ * Created by xuxueli on 17/5/10.
5
+ */
6
+public class RegistryConfig {
7
+
8
+    public static final int BEAT_TIMEOUT = 30;
9
+    public static final int DEAD_TIMEOUT = BEAT_TIMEOUT * 3;
10
+
11
+    public enum RegistType{ EXECUTOR, ADMIN }
12
+
13
+}

+ 4 - 5
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java Zobrazit soubor

@@ -4,7 +4,6 @@ import com.xxl.job.core.biz.ExecutorBiz;
4 4
 import com.xxl.job.core.biz.impl.ExecutorBizImpl;
5 5
 import com.xxl.job.core.handler.IJobHandler;
6 6
 import com.xxl.job.core.handler.annotation.JobHander;
7
-import com.xxl.job.core.registry.RegistHelper;
8 7
 import com.xxl.job.core.rpc.netcom.NetComServerFactory;
9 8
 import com.xxl.job.core.thread.ExecutorRegistryThread;
10 9
 import com.xxl.job.core.thread.JobThread;
@@ -30,7 +29,7 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
30 29
     private String ip;
31 30
     private int port = 9999;
32 31
     private String appName;
33
-    private RegistHelper registHelper;
32
+    public static String adminAddresses;
34 33
     public static String logPath;
35 34
 
36 35
     public void setIp(String ip) {
@@ -42,8 +41,8 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
42 41
     public void setAppName(String appName) {
43 42
         this.appName = appName;
44 43
     }
45
-    public void setRegistHelper(RegistHelper registHelper) {
46
-        this.registHelper = registHelper;
44
+    public void setAdminAddresses(String adminAddresses) {
45
+        this.adminAddresses = adminAddresses;
47 46
     }
48 47
     public void setLogPath(String logPath) {
49 48
         this.logPath = logPath;
@@ -54,7 +53,7 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
54 53
     public void start() throws Exception {
55 54
         // executor start
56 55
         NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());
57
-        serverFactory.start(port, ip, appName, registHelper);
56
+        serverFactory.start(port, ip, appName);
58 57
 
59 58
         // trigger callback thread start
60 59
         TriggerCallbackThread.getInstance().start();

+ 0 - 13
xxl-job-core/src/main/java/com/xxl/job/core/registry/RegistHelper.java Zobrazit soubor

@@ -1,13 +0,0 @@
1
-package com.xxl.job.core.registry;
2
-
3
-/**
4
- * Created by xuxueli on 16/9/30.
5
- */
6
-public interface RegistHelper {
7
-
8
-    public static final int TIMEOUT = 15;
9
-    public enum RegistType{ EXECUTOR, ADMIN }
10
-
11
-    public int registry(String registGroup, String registryKey, String registryValue);
12
-
13
-}

+ 0 - 28
xxl-job-core/src/main/java/com/xxl/job/core/registry/impl/DbRegistHelper.java Zobrazit soubor

@@ -1,28 +0,0 @@
1
-package com.xxl.job.core.registry.impl;
2
-
3
-import com.xxl.job.core.registry.RegistHelper;
4
-import com.xxl.job.core.util.DBUtil;
5
-
6
-import javax.sql.DataSource;
7
-
8
-/**
9
- * Created by xuxueli on 16/9/30.
10
- */
11
-public class DbRegistHelper implements RegistHelper {
12
-
13
-    private DataSource dataSource;
14
-    public void setDataSource(DataSource dataSource) {
15
-        this.dataSource = dataSource;
16
-    }
17
-
18
-    @Override
19
-    public int registry(String registGroup, String registryKey, String registryValue) {
20
-        String updateSql = "UPDATE XXL_JOB_QRTZ_TRIGGER_REGISTRY SET `update_time` = NOW() WHERE `registry_group` = ? AND `registry_key` = ? AND `registry_value` = ?";
21
-        String insertSql = "INSERT INTO XXL_JOB_QRTZ_TRIGGER_REGISTRY( `registry_group` , `registry_key` , `registry_value`, `update_time`) VALUES(? , ? , ?, NOW())";
22
-        int ret = DBUtil.update(dataSource, updateSql, new Object[]{registGroup, registryKey, registryValue});
23
-        if (ret<1) {
24
-            ret = DBUtil.update(dataSource, insertSql, new Object[]{registGroup, registryKey, registryValue});
25
-        }
26
-        return ret;
27
-    }
28
-}

+ 2 - 3
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java Zobrazit soubor

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.core.rpc.netcom;
2 2
 
3 3
 import com.xxl.job.core.biz.model.ReturnT;
4
-import com.xxl.job.core.registry.RegistHelper;
5 4
 import com.xxl.job.core.rpc.codec.RpcRequest;
6 5
 import com.xxl.job.core.rpc.codec.RpcResponse;
7 6
 import com.xxl.job.core.rpc.netcom.jetty.server.JettyServer;
@@ -22,8 +21,8 @@ public class NetComServerFactory  {
22 21
 
23 22
 	// ---------------------- server start ----------------------
24 23
 	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);
24
+	public void start(int port, String ip, String appName) throws Exception {
25
+		server.start(port, ip, appName);
27 26
 	}
28 27
 
29 28
 	// ---------------------- server destroy ----------------------

+ 2 - 3
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java Zobrazit soubor

@@ -1,6 +1,5 @@
1 1
 package com.xxl.job.core.rpc.netcom.jetty.server;
2 2
 
3
-import com.xxl.job.core.registry.RegistHelper;
4 3
 import com.xxl.job.core.thread.ExecutorRegistryThread;
5 4
 import org.eclipse.jetty.server.Connector;
6 5
 import org.eclipse.jetty.server.Handler;
@@ -20,7 +19,7 @@ public class JettyServer {
20 19
 
21 20
 	private Server server;
22 21
 	private Thread thread;
23
-	public void start(final int port, final String ip, final String appName, final RegistHelper registHelper) throws Exception {
22
+	public void start(final int port, final String ip, final String appName) throws Exception {
24 23
 		thread = new Thread(new Runnable() {
25 24
 			@Override
26 25
 			public void run() {
@@ -42,7 +41,7 @@ public class JettyServer {
42 41
 					// Start the server
43 42
 					server.start();
44 43
 					logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
45
-					ExecutorRegistryThread.getInstance().start(port, ip, appName, registHelper);
44
+					ExecutorRegistryThread.getInstance().start(port, ip, appName);
46 45
 					server.join();	// block until thread stopped
47 46
 					logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
48 47
 				} catch (Exception e) {

+ 29 - 14
xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java Zobrazit soubor

@@ -1,7 +1,12 @@
1 1
 package com.xxl.job.core.thread;
2 2
 
3
-import com.xxl.job.core.registry.RegistHelper;
3
+import com.xxl.job.core.biz.model.RegistryParam;
4
+import com.xxl.job.core.biz.model.ReturnT;
5
+import com.xxl.job.core.enums.RegistryConfig;
6
+import com.xxl.job.core.util.AdminApiUtil;
4 7
 import com.xxl.job.core.util.IpUtil;
8
+import org.slf4j.Logger;
9
+import org.slf4j.LoggerFactory;
5 10
 
6 11
 import java.util.concurrent.TimeUnit;
7 12
 
@@ -9,6 +14,7 @@ import java.util.concurrent.TimeUnit;
9 14
  * Created by xuxueli on 17/3/2.
10 15
  */
11 16
 public class ExecutorRegistryThread extends Thread {
17
+    private static Logger logger = LoggerFactory.getLogger(ExecutorRegistryThread.class);
12 18
 
13 19
     private static ExecutorRegistryThread instance = new ExecutorRegistryThread();
14 20
     public static ExecutorRegistryThread getInstance(){
@@ -17,27 +23,36 @@ public class ExecutorRegistryThread extends Thread {
17 23
 
18 24
     private Thread registryThread;
19 25
     private boolean toStop = false;
20
-    public void start(final int port, final String ip, final String appName, final RegistHelper registHelper){
21
-        if (registHelper==null && appName==null || appName.trim().length()==0) {
26
+    public void start(final int port, final String ip, final String appName){
27
+        if (appName==null || appName.trim().length()==0) {
28
+            logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail");
22 29
             return;
23 30
         }
31
+
32
+        // executor address (generate addredd = ip:port)
33
+        final String executorAddress;
34
+        if (ip != null && ip.trim().length()>0) {
35
+            executorAddress = ip.trim().concat(":").concat(String.valueOf(port));
36
+        } else {
37
+            executorAddress = IpUtil.getIpPort(port);
38
+        }
39
+
24 40
         registryThread = new Thread(new Runnable() {
25 41
             @Override
26 42
             public void run() {
27 43
                 while (!toStop) {
28 44
                     try {
29
-                        // generate addredd = ip:port
30
-                        String address = null;
31
-                        if (ip != null && ip.trim().length()>0) {
32
-                            address = ip.trim().concat(":").concat(String.valueOf(port));
33
-                        } else {
34
-                            address = IpUtil.getIpPort(port);
35
-                        }
36
-
37
-                        registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address);
38
-                        TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
45
+                        RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appName, executorAddress);
46
+                        ReturnT<String> registryResult = AdminApiUtil.callApiFailover(AdminApiUtil.REGISTRY, registryParam);
47
+                        logger.info(">>>>>>>>>>> xxl-job registry, RegistryParam:{}, registryResult:{}", new Object[]{registryParam.toString(), registryResult.toString()});
39 48
                     } catch (Exception e) {
40
-                        e.printStackTrace();
49
+                        logger.error(">>>>>>>>>>> xxl-job ExecutorRegistryThread Exception:", e);
50
+                    }
51
+
52
+                    try {
53
+                        TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
54
+                    } catch (InterruptedException e) {
55
+                        logger.error(e.getMessage(), e);
41 56
                     }
42 57
                 }
43 58
             }

+ 3 - 3
xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java Zobrazit soubor

@@ -131,11 +131,11 @@ public class JobThread extends Thread{
131 131
 					// callback handler info
132 132
 					if (!toStop) {
133 133
 						// commonm
134
-						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), executeResult));
134
+						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult));
135 135
 					} else {
136 136
 						// is killed
137 137
 						ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]");
138
-						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), stopResult));
138
+						TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
139 139
 					}
140 140
 				}
141 141
 			} catch (Exception e) {
@@ -156,7 +156,7 @@ public class JobThread extends Thread{
156 156
 			if (triggerParam!=null) {
157 157
 				// is killed
158 158
 				ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]");
159
-				TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), stopResult));
159
+				TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
160 160
 			}
161 161
 		}
162 162
 		

+ 7 - 15
xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java Zobrazit soubor

@@ -1,9 +1,8 @@
1 1
 package com.xxl.job.core.thread;
2 2
 
3
-import com.xxl.job.core.biz.AdminBiz;
4 3
 import com.xxl.job.core.biz.model.HandleCallbackParam;
5 4
 import com.xxl.job.core.biz.model.ReturnT;
6
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
5
+import com.xxl.job.core.util.AdminApiUtil;
7 6
 import org.slf4j.Logger;
8 7
 import org.slf4j.LoggerFactory;
9 8
 
@@ -33,19 +32,12 @@ public class TriggerCallbackThread {
33 32
                     try {
34 33
                         HandleCallbackParam callback = getInstance().callBackQueue.take();
35 34
                         if (callback != null) {
36
-                            for (String address : callback.getLogAddress()) {
37
-                                try {
38
-                                    // callback
39
-                                    AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, address).getObject();
40
-                                    ReturnT<String> callbackResult = adminBiz.callback(callback);
41
-
42
-                                    logger.info(">>>>>>>>>>> xxl-job callback , CallbackParam:{}, callbackResult:{}", new Object[]{callback.toString(), callbackResult.toString()});
43
-                                    if (ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
44
-                                        break;
45
-                                    }
46
-                                } catch (Exception e) {
47
-                                    logger.error(">>>>>>>>>>> xxl-job TriggerCallbackThread Exception:", e);
48
-                                }
35
+                            // callback
36
+                            try {
37
+                                ReturnT<String> callbackResult = AdminApiUtil.callApiFailover(AdminApiUtil.CALLBACK, callback);
38
+                                logger.info(">>>>>>>>>>> xxl-job callback, HandleCallbackParam:{}, callbackResult:{}", new Object[]{callback.toString(), callbackResult.toString()});
39
+                            } catch (Exception e) {
40
+                                logger.error(">>>>>>>>>>> xxl-job TriggerCallbackThread Exception:", e);
49 41
                             }
50 42
                         }
51 43
                     } catch (Exception e) {

+ 116 - 0
xxl-job-core/src/main/java/com/xxl/job/core/util/AdminApiUtil.java Zobrazit soubor

@@ -0,0 +1,116 @@
1
+package com.xxl.job.core.util;
2
+
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.job.core.executor.XxlJobExecutor;
5
+import org.apache.http.HttpEntity;
6
+import org.apache.http.HttpResponse;
7
+import org.apache.http.client.config.RequestConfig;
8
+import org.apache.http.client.methods.HttpPost;
9
+import org.apache.http.entity.StringEntity;
10
+import org.apache.http.impl.client.CloseableHttpClient;
11
+import org.apache.http.impl.client.HttpClients;
12
+import org.apache.http.util.EntityUtils;
13
+import org.slf4j.Logger;
14
+import org.slf4j.LoggerFactory;
15
+
16
+import java.io.IOException;
17
+import java.util.ArrayList;
18
+import java.util.List;
19
+
20
+/**
21
+ * @author xuxueli 2017-05-10 21:28:15
22
+ */
23
+public class AdminApiUtil {
24
+	private static Logger logger = LoggerFactory.getLogger(AdminApiUtil.class);
25
+
26
+	public static final String CALLBACK = "/api/callback";
27
+	public static final String REGISTRY = "/api/registry";
28
+
29
+	public static ReturnT<String> callApiFailover(String subUrl, Object requestObj) throws Exception {
30
+
31
+		// admin assress list
32
+		List<String> adminAddressList = new ArrayList<String>();
33
+		if (XxlJobExecutor.adminAddresses != null) {
34
+			for (String adminAddressItem: XxlJobExecutor.adminAddresses.split(",")) {
35
+				if (adminAddressItem.trim().length()>0 && !adminAddressList.contains(adminAddressItem)) {
36
+					adminAddressList.add(adminAddressItem);
37
+				}
38
+			}
39
+		}
40
+		if (adminAddressList==null || adminAddressList.size()==0) {
41
+			return ReturnT.FAIL;
42
+		}
43
+
44
+		for (String adminAddress: adminAddressList) {
45
+			ReturnT<String> registryResult = null;
46
+			try {
47
+				String apiUrl = adminAddress.concat(subUrl);
48
+				registryResult = callApi(apiUrl, requestObj);
49
+			} catch (Exception e) {
50
+				logger.error(e.getMessage(), e);
51
+			}
52
+			if (registryResult!=null && registryResult.getCode()==ReturnT.SUCCESS_CODE) {
53
+				return ReturnT.SUCCESS;
54
+			}
55
+		}
56
+		return ReturnT.FAIL;
57
+	}
58
+
59
+	public static ReturnT<String> callApi(String finalUrl, Object requestObj) throws Exception {
60
+		HttpPost httpPost = new HttpPost(finalUrl);
61
+		CloseableHttpClient httpClient = HttpClients.createDefault();
62
+		try {
63
+
64
+			// timeout
65
+			RequestConfig requestConfig = RequestConfig.custom()
66
+					.setConnectionRequestTimeout(10000)
67
+					.setSocketTimeout(10000)
68
+					.setConnectTimeout(10000)
69
+					.build();
70
+
71
+			httpPost.setConfig(requestConfig);
72
+
73
+			// data
74
+			if (requestObj != null) {
75
+				String json = JacksonUtil.writeValueAsString(requestObj);
76
+
77
+				StringEntity entity = new StringEntity(json, "utf-8");
78
+				entity.setContentEncoding("UTF-8");
79
+				entity.setContentType("application/json");
80
+
81
+				httpPost.setEntity(entity);
82
+			}
83
+
84
+			// do post
85
+			HttpResponse response = httpClient.execute(httpPost);
86
+			HttpEntity entity = response.getEntity();
87
+			if (null != entity) {
88
+				if (response.getStatusLine().getStatusCode() != 200) {
89
+					EntityUtils.consume(entity);
90
+					return ReturnT.FAIL;
91
+				}
92
+
93
+				String responseMsg = EntityUtils.toString(entity, "UTF-8");
94
+				EntityUtils.consume(entity);
95
+				if (responseMsg!=null && responseMsg.startsWith("{")) {
96
+					ReturnT<String> result = JacksonUtil.readValue(responseMsg, ReturnT.class);
97
+					return result;
98
+				}
99
+			}
100
+			return ReturnT.FAIL;
101
+		} catch (Exception e) {
102
+			logger.error("", e);
103
+			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
104
+		} finally {
105
+			if (httpPost!=null) {
106
+				httpPost.releaseConnection();
107
+			}
108
+			try {
109
+				httpClient.close();
110
+			} catch (IOException e) {
111
+				e.printStackTrace();
112
+			}
113
+		}
114
+	}
115
+	
116
+}

+ 1 - 1
xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java Zobrazit soubor

@@ -105,5 +105,5 @@ public class HttpClientUtil {
105 105
 		}
106 106
 		return new byte[] {};
107 107
 	}
108
-	
108
+
109 109
 }

+ 93 - 0
xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java Zobrazit soubor

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

+ 4 - 25
xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml Zobrazit soubor

@@ -27,34 +27,13 @@
27 27
 		<property name="ip" value="${xxl.job.executor.ip}" />
28 28
 		<!-- 执行器端口号 -->
29 29
 		<property name="port" value="${xxl.job.executor.port}" />
30
+		<!-- 执行器AppName,为空则关闭自动注册 -->
30 31
         <property name="appName" value="${xxl.job.executor.appname}" />
31
-        <!-- 执行器注册器 -->
32
-        <property name="registHelper" >
33
-            <!-- 执行器 "DbRegistHelper" 依赖 "XXL-JOB公共数据源" ;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置;  -->
34
-            <bean class="com.xxl.job.core.registry.impl.DbRegistHelper" >
35
-                <!-- XXL-JOB公共数据源 -->
36
-                <property name="dataSource" ref="xxlJobDataSource" />
37
-            </bean>
38
-        </property>
32
+        <!-- 执行器注册中心地址,为空则关闭自动注册 -->
33
+		<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
34
+		<!-- 执行器日志路径 -->
39 35
 		<property name="logPath" value="${xxl.job.executor.logpath}" />
40 36
 	</bean>
41 37
 
42
-    <!-- ********************************* "XXL-JOB公共数据源" 配置, 仅在启动 "DbRegistHelper" 时才需要, 否则可删除 ********************************* -->
43
-
44
-	<!-- 配置03、XXL-JOB公共数据源 -->
45
-	<bean id="xxlJobDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
46
-		<property name="driverClass" value="${xxl.job.db.driverClass}" />
47
-		<property name="jdbcUrl" value="${xxl.job.db.url}" />
48
-		<property name="user" value="${xxl.job.db.user}" />
49
-		<property name="password" value="${xxl.job.db.password}" />
50
-		<property name="initialPoolSize" value="3" />
51
-		<property name="minPoolSize" value="2" />
52
-		<property name="maxPoolSize" value="10" />
53
-		<property name="maxIdleTime" value="60" />
54
-		<property name="acquireRetryDelay" value="1000" />
55
-		<property name="acquireRetryAttempts" value="10" />
56
-		<property name="preferredTestQuery" value="SELECT 1" />
57
-	</bean>
58
-
59 38
 
60 39
 </beans>

+ 2 - 5
xxl-job-executor-example/src/main/resources/xxl-job-executor.properties Zobrazit soubor

@@ -1,8 +1,5 @@
1
-### xxl-job db
2
-xxl.job.db.driverClass=com.mysql.jdbc.Driver
3
-xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
4
-xxl.job.db.user=root
5
-xxl.job.db.password=root_pwd
1
+### xxl-job admin address, such as "http://host01:port01/project,http://host02:port02/project"
2
+xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
6 3
 
7 4
 ### xxl-job executor address
8 5
 xxl.job.executor.appname=xxl-job-executor-example