Преглед на файлове

调度中心移除SQL中的 "now()" 函数;集群部署时不再依赖DB时钟,仅需要保证调度中心应用节点时钟一致即可;

xuxueli преди 5 години
родител
ревизия
71cf3f611f

+ 5 - 5
doc/XXL-JOB官方文档.md Целия файл

@@ -475,7 +475,6 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
475 475
 
476 476
 调度中心集群部署时,几点要求和建议:
477 477
 - DB配置保持一致;
478
-- 登陆账号配置保持一致;
479 478
 - 集群机器时钟保持一致(单机集群忽视);
480 479
 - 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
481 480
 
@@ -1588,10 +1587,11 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1588 1587
 - 16、任务告警组件分页参数无效问题修复;
1589 1588
 - 17、DB脚本默认编码改为utf8mb4,修复字符乱码问题(建议Mysql版本5.7+);
1590 1589
 - 18、调度中心任务平均分配,触发组件每次获取与线程池数量相关数量的任务,避免大量任务集中在单个调度中心集群节点;
1591
-- 19、[ING]xxl-rpc服务端线程优化,降低线程内存开销;
1592
-- 20、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1593
-- 21、[ING]调度中心日志删除,改为分页获取ID,根据ID删除的方式;
1594
-- 22、[ING]任务回调改为restful方式;
1590
+- 19、调度中心移除SQL中的 "now()" 函数;集群部署时不再依赖DB时钟,仅需要保证调度中心应用节点时钟一致即可;
1591
+- 20、[ING]xxl-rpc服务端线程优化,降低线程内存开销;
1592
+- 21、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1593
+- 22、[ING]调度中心日志删除,改为分页获取ID,根据ID删除的方式;
1594
+- 23、[ING]任务回调改为restful方式;
1595 1595
 
1596 1596
 
1597 1597
 ### TODO LIST

+ 3 - 3
doc/db/tables_xxl_job.sql Целия файл

@@ -59,8 +59,8 @@ CREATE TABLE `xxl_job_logglue` (
59 59
   `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
60 60
   `glue_source` mediumtext COMMENT 'GLUE源代码',
61 61
   `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
62
-  `add_time` timestamp NULL DEFAULT NULL,
63
-  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
62
+  `add_time` datetime DEFAULT NULL,
63
+  `update_time` datetime DEFAULT NULL,
64 64
   PRIMARY KEY (`id`)
65 65
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
66 66
 
@@ -69,7 +69,7 @@ CREATE TABLE `xxl_job_registry` (
69 69
   `registry_group` varchar(50) NOT NULL,
70 70
   `registry_key` varchar(255) NOT NULL,
71 71
   `registry_value` varchar(255) NOT NULL,
72
-  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
72
+  `update_time` datetime DEFAULT NULL,
73 73
   PRIMARY KEY (`id`),
74 74
   KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
75 75
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

+ 5 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java Целия файл

@@ -72,6 +72,8 @@ public class JobCodeController {
72 72
 		exists_jobInfo.setGlueSource(glueSource);
73 73
 		exists_jobInfo.setGlueRemark(glueRemark);
74 74
 		exists_jobInfo.setGlueUpdatetime(new Date());
75
+
76
+		exists_jobInfo.setUpdateTime(new Date());
75 77
 		xxlJobInfoDao.update(exists_jobInfo);
76 78
 
77 79
 		// log old code
@@ -80,6 +82,9 @@ public class JobCodeController {
80 82
 		xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType());
81 83
 		xxlJobLogGlue.setGlueSource(glueSource);
82 84
 		xxlJobLogGlue.setGlueRemark(glueRemark);
85
+
86
+		xxlJobLogGlue.setAddTime(new Date());
87
+		xxlJobLogGlue.setUpdateTime(new Date());
83 88
 		xxlJobLogGlueDao.save(xxlJobLogGlue);
84 89
 
85 90
 		// remove code backup more than 30

+ 2 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Целия файл

@@ -14,10 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
14 14
 import org.springframework.web.bind.annotation.ResponseBody;
15 15
 
16 16
 import javax.annotation.Resource;
17
-import java.util.ArrayList;
18
-import java.util.Collections;
19
-import java.util.HashMap;
20
-import java.util.List;
17
+import java.util.*;
21 18
 
22 19
 /**
23 20
  * job group controller
@@ -119,7 +116,7 @@ public class JobGroupController {
119 116
 
120 117
 	private List<String> findRegistryByAppName(String appNameParam){
121 118
 		HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
122
-		List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
119
+		List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
123 120
 		if (list != null) {
124 121
 			for (XxlJobRegistry item: list) {
125 122
 				if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {

+ 8 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java Целия файл

@@ -1,5 +1,7 @@
1 1
 package com.xxl.job.admin.core.model;
2 2
 
3
+import java.util.Date;
4
+
3 5
 /**
4 6
  * xxl-job log for glue, used to track job code process
5 7
  * @author xuxueli 2016-5-19 17:57:46
@@ -11,8 +13,8 @@ public class XxlJobLogGlue {
11 13
 	private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
12 14
 	private String glueSource;
13 15
 	private String glueRemark;
14
-	private String addTime;
15
-	private String updateTime;
16
+	private Date addTime;
17
+	private Date updateTime;
16 18
 
17 19
 	public int getId() {
18 20
 		return id;
@@ -54,19 +56,19 @@ public class XxlJobLogGlue {
54 56
 		this.glueRemark = glueRemark;
55 57
 	}
56 58
 
57
-	public String getAddTime() {
59
+	public Date getAddTime() {
58 60
 		return addTime;
59 61
 	}
60 62
 
61
-	public void setAddTime(String addTime) {
63
+	public void setAddTime(Date addTime) {
62 64
 		this.addTime = addTime;
63 65
 	}
64 66
 
65
-	public String getUpdateTime() {
67
+	public Date getUpdateTime() {
66 68
 		return updateTime;
67 69
 	}
68 70
 
69
-	public void setUpdateTime(String updateTime) {
71
+	public void setUpdateTime(Date updateTime) {
70 72
 		this.updateTime = updateTime;
71 73
 	}
72 74
 

+ 3 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java Целия файл

@@ -7,10 +7,7 @@ import com.xxl.job.core.enums.RegistryConfig;
7 7
 import org.slf4j.Logger;
8 8
 import org.slf4j.LoggerFactory;
9 9
 
10
-import java.util.ArrayList;
11
-import java.util.Collections;
12
-import java.util.HashMap;
13
-import java.util.List;
10
+import java.util.*;
14 11
 import java.util.concurrent.TimeUnit;
15 12
 
16 13
 /**
@@ -38,14 +35,14 @@ public class JobRegistryMonitorHelper {
38 35
 						if (groupList!=null && !groupList.isEmpty()) {
39 36
 
40 37
 							// remove dead address (admin/executor)
41
-							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT);
38
+							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
42 39
 							if (ids!=null && ids.size()>0) {
43 40
 								XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
44 41
 							}
45 42
 
46 43
 							// fresh online address (admin/executor)
47 44
 							HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
48
-							List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT);
45
+							List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
49 46
 							if (list != null) {
50 47
 								for (XxlJobRegistry item: list) {
51 48
 									if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {

+ 9 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java Целия файл

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobRegistry;
4 4
 import org.apache.ibatis.annotations.Mapper;
5 5
 import org.apache.ibatis.annotations.Param;
6 6
 
7
+import java.util.Date;
7 8
 import java.util.List;
8 9
 
9 10
 /**
@@ -12,19 +13,23 @@ import java.util.List;
12 13
 @Mapper
13 14
 public interface XxlJobRegistryDao {
14 15
 
15
-    public List<Integer> findDead(@Param("timeout") int timeout);
16
+    public List<Integer> findDead(@Param("timeout") int timeout,
17
+                                  @Param("nowTime") Date nowTime);
16 18
 
17 19
     public int removeDead(@Param("ids") List<Integer> ids);
18 20
 
19
-    public List<XxlJobRegistry> findAll(@Param("timeout") int timeout);
21
+    public List<XxlJobRegistry> findAll(@Param("timeout") int timeout,
22
+                                        @Param("nowTime") Date nowTime);
20 23
 
21 24
     public int registryUpdate(@Param("registryGroup") String registryGroup,
22 25
                               @Param("registryKey") String registryKey,
23
-                              @Param("registryValue") String registryValue);
26
+                              @Param("registryValue") String registryValue,
27
+                              @Param("updateTime") Date updateTime);
24 28
 
25 29
     public int registrySave(@Param("registryGroup") String registryGroup,
26 30
                             @Param("registryKey") String registryKey,
27
-                            @Param("registryValue") String registryValue);
31
+                            @Param("registryValue") String registryValue,
32
+                            @Param("updateTime") Date updateTime);
28 33
 
29 34
     public int registryDelete(@Param("registryGroup") String registGroup,
30 35
                           @Param("registryKey") String registryKey,

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java Целия файл

@@ -126,9 +126,9 @@ public class AdminBizImpl implements AdminBiz {
126 126
 
127 127
     @Override
128 128
     public ReturnT<String> registry(RegistryParam registryParam) {
129
-        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
129
+        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
130 130
         if (ret < 1) {
131
-            xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
131
+            xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
132 132
 
133 133
             // fresh
134 134
             freshGroupRegistryInfo(registryParam);

+ 7 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Целия файл

@@ -117,6 +117,9 @@ public class XxlJobServiceImpl implements XxlJobService {
117 117
 		}
118 118
 
119 119
 		// add in db
120
+		jobInfo.setAddTime(new Date());
121
+		jobInfo.setUpdateTime(new Date());
122
+		jobInfo.setGlueUpdatetime(new Date());
120 123
 		xxlJobInfoDao.save(jobInfo);
121 124
 		if (jobInfo.getId() < 1) {
122 125
 			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
@@ -220,6 +223,8 @@ public class XxlJobServiceImpl implements XxlJobService {
220 223
 		exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
221 224
 		exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
222 225
 		exists_jobInfo.setTriggerNextTime(nextTriggerTime);
226
+
227
+		exists_jobInfo.setUpdateTime(new Date());
223 228
         xxlJobInfoDao.update(exists_jobInfo);
224 229
 
225 230
 
@@ -260,6 +265,7 @@ public class XxlJobServiceImpl implements XxlJobService {
260 265
 		xxlJobInfo.setTriggerLastTime(0);
261 266
 		xxlJobInfo.setTriggerNextTime(nextTriggerTime);
262 267
 
268
+		xxlJobInfo.setUpdateTime(new Date());
263 269
 		xxlJobInfoDao.update(xxlJobInfo);
264 270
 		return ReturnT.SUCCESS;
265 271
 	}
@@ -272,6 +278,7 @@ public class XxlJobServiceImpl implements XxlJobService {
272 278
 		xxlJobInfo.setTriggerLastTime(0);
273 279
 		xxlJobInfo.setTriggerNextTime(0);
274 280
 
281
+		xxlJobInfo.setUpdateTime(new Date());
275 282
 		xxlJobInfoDao.update(xxlJobInfo);
276 283
 		return ReturnT.SUCCESS;
277 284
 	}

+ 4 - 4
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Целия файл

@@ -133,8 +133,8 @@
133 133
 			#{jobGroup},
134 134
 			#{jobCron},
135 135
 			#{jobDesc},
136
-			NOW(),
137
-			NOW(),
136
+			#{addTime},
137
+			#{updateTime},
138 138
 			#{author},
139 139
 			#{alarmEmail},
140 140
 			#{executorRouteStrategy},
@@ -146,7 +146,7 @@
146 146
 			#{glueType},
147 147
 			#{glueSource},
148 148
 			#{glueRemark},
149
-			NOW(),
149
+			#{glueUpdatetime},
150 150
 			#{childJobId},
151 151
 			#{triggerStatus},
152 152
 			#{triggerLastTime},
@@ -170,7 +170,7 @@
170 170
 			job_group = #{jobGroup},
171 171
 			job_cron = #{jobCron},
172 172
 			job_desc = #{jobDesc},
173
-			update_time = NOW(),
173
+			update_time = #{updateTime},
174 174
 			author = #{author},
175 175
 			alarm_email = #{alarmEmail},
176 176
 			executor_route_strategy = #{executorRouteStrategy},

+ 2 - 2
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml Целия файл

@@ -36,8 +36,8 @@
36 36
 			#{glueType},
37 37
 			#{glueSource},
38 38
 			#{glueRemark},
39
-			now(),
40
-			now()
39
+			#{addTime},
40
+			#{updateTime}
41 41
 		);
42 42
 		<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
43 43
 			SELECT LAST_INSERT_ID() 

+ 4 - 4
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml Целия файл

@@ -22,7 +22,7 @@
22 22
 	<select id="findDead" parameterType="java.lang.Integer" resultType="java.lang.Integer" >
23 23
 		SELECT t.id
24 24
 		FROM xxl_job_registry AS t
25
-		WHERE t.update_time <![CDATA[ < ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
25
+		WHERE t.update_time <![CDATA[ < ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)
26 26
 	</select>
27 27
 	
28 28
 	<delete id="removeDead" parameterType="java.lang.Integer" >
@@ -36,12 +36,12 @@
36 36
 	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobRegistry">
37 37
 		SELECT <include refid="Base_Column_List" />
38 38
 		FROM xxl_job_registry AS t
39
-		WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
39
+		WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)
40 40
 	</select>
41 41
 
42 42
     <update id="registryUpdate" >
43 43
         UPDATE xxl_job_registry
44
-        SET `update_time` = NOW()
44
+        SET `update_time` = #{updateTime}
45 45
         WHERE `registry_group` = #{registryGroup}
46 46
           AND `registry_key` = #{registryKey}
47 47
           AND `registry_value` = #{registryValue}
@@ -49,7 +49,7 @@
49 49
 
50 50
     <insert id="registrySave" >
51 51
         INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`)
52
-        VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, NOW())
52
+        VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, #{updateTime})
53 53
     </insert>
54 54
 
55 55
 	<delete id="registryDelete" >

+ 5 - 2
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java Целия файл

@@ -4,8 +4,6 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
4 4
 import org.junit.Test;
5 5
 import org.junit.runner.RunWith;
6 6
 import org.springframework.boot.test.context.SpringBootTest;
7
-import org.springframework.test.context.ContextConfiguration;
8
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
9 7
 import org.springframework.test.context.junit4.SpringRunner;
10 8
 
11 9
 import javax.annotation.Resource;
@@ -47,6 +45,10 @@ public class XxlJobInfoDaoTest {
47 45
 		info.setGlueRemark("setGlueRemark");
48 46
 		info.setChildJobId("1");
49 47
 
48
+		info.setAddTime(new Date());
49
+		info.setUpdateTime(new Date());
50
+		info.setGlueUpdatetime(new Date());
51
+
50 52
 		int count = xxlJobInfoDao.save(info);
51 53
 
52 54
 		XxlJobInfo info2 = xxlJobInfoDao.loadById(info.getId());
@@ -64,6 +66,7 @@ public class XxlJobInfoDaoTest {
64 66
 		info2.setGlueUpdatetime(new Date());
65 67
 		info2.setChildJobId("1");
66 68
 
69
+		info2.setUpdateTime(new Date());
67 70
 		int item2 = xxlJobInfoDao.update(info2);
68 71
 
69 72
 		xxlJobInfoDao.delete(info2.getId());

+ 4 - 3
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java Целия файл

@@ -1,15 +1,13 @@
1 1
 package com.xxl.job.admin.dao;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
4
-import com.xxl.job.admin.dao.XxlJobLogGlueDao;
5 4
 import org.junit.Test;
6 5
 import org.junit.runner.RunWith;
7 6
 import org.springframework.boot.test.context.SpringBootTest;
8
-import org.springframework.test.context.ContextConfiguration;
9
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10 7
 import org.springframework.test.context.junit4.SpringRunner;
11 8
 
12 9
 import javax.annotation.Resource;
10
+import java.util.Date;
13 11
 import java.util.List;
14 12
 
15 13
 @RunWith(SpringRunner.class)
@@ -26,6 +24,9 @@ public class XxlJobLogGlueDaoTest {
26 24
         logGlue.setGlueType("1");
27 25
         logGlue.setGlueSource("1");
28 26
         logGlue.setGlueRemark("1");
27
+
28
+        logGlue.setAddTime(new Date());
29
+        logGlue.setUpdateTime(new Date());
29 30
         int ret = xxlJobLogGlueDao.save(logGlue);
30 31
 
31 32
         List<XxlJobLogGlue> list = xxlJobLogGlueDao.findByJobId(1);

+ 4 - 3
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java Целия файл

@@ -8,6 +8,7 @@ import org.springframework.test.context.junit4.SpringRunner;
8 8
 
9 9
 import javax.annotation.Resource;
10 10
 import java.util.Arrays;
11
+import java.util.Date;
11 12
 import java.util.List;
12 13
 
13 14
 @RunWith(SpringRunner.class)
@@ -19,12 +20,12 @@ public class XxlJobRegistryDaoTest {
19 20
 
20 21
     @Test
21 22
     public void test(){
22
-        int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1");
23
+        int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date());
23 24
         if (ret < 1) {
24
-            ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1");
25
+            ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1", new Date());
25 26
         }
26 27
 
27
-        List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(1);
28
+        List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(1, new Date());
28 29
 
29 30
         int ret2 = xxlJobRegistryDao.removeDead(Arrays.asList(1));
30 31
     }