浏览代码

Merge pull request #1105 from WEIZIBIN/fix_graceful_shutdown_unregister_fast

许雪里 5 年前
父节点
当前提交
4a0fe49b26
没有帐户链接到提交者的电子邮件

+ 4 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java 查看文件

16
 
16
 
17
     public List<XxlJobGroup> findByAddressType(@Param("addressType") int addressType);
17
     public List<XxlJobGroup> findByAddressType(@Param("addressType") int addressType);
18
 
18
 
19
+    public List<XxlJobGroup> findAutoRegisterGroupByAppName(@Param("appName") String appName);
20
+
21
+    public int updateAddressListById(@Param("id") int id, @Param("addressList") String addressList);
22
+
19
     public int save(XxlJobGroup xxlJobGroup);
23
     public int save(XxlJobGroup xxlJobGroup);
20
 
24
 
21
     public int update(XxlJobGroup xxlJobGroup);
25
     public int update(XxlJobGroup xxlJobGroup);

+ 39 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java 查看文件

1
 package com.xxl.job.admin.service.impl;
1
 package com.xxl.job.admin.service.impl;
2
 
2
 
3
+import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobLog;
5
 import com.xxl.job.admin.core.model.XxlJobLog;
5
 import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
6
 import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
6
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
7
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
7
 import com.xxl.job.admin.core.util.I18nUtil;
8
 import com.xxl.job.admin.core.util.I18nUtil;
9
+import com.xxl.job.admin.dao.XxlJobGroupDao;
8
 import com.xxl.job.admin.dao.XxlJobInfoDao;
10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
9
 import com.xxl.job.admin.dao.XxlJobLogDao;
11
 import com.xxl.job.admin.dao.XxlJobLogDao;
10
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
12
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
16
 import org.slf4j.Logger;
18
 import org.slf4j.Logger;
17
 import org.slf4j.LoggerFactory;
19
 import org.slf4j.LoggerFactory;
18
 import org.springframework.stereotype.Service;
20
 import org.springframework.stereotype.Service;
21
+import org.springframework.util.CollectionUtils;
22
+import org.springframework.util.StringUtils;
19
 
23
 
20
 import javax.annotation.Resource;
24
 import javax.annotation.Resource;
21
 import java.text.MessageFormat;
25
 import java.text.MessageFormat;
35
     private XxlJobInfoDao xxlJobInfoDao;
39
     private XxlJobInfoDao xxlJobInfoDao;
36
     @Resource
40
     @Resource
37
     private XxlJobRegistryDao xxlJobRegistryDao;
41
     private XxlJobRegistryDao xxlJobRegistryDao;
42
+    @Resource
43
+    private XxlJobGroupDao xxlJobGroupDao;
38
 
44
 
39
 
45
 
40
     @Override
46
     @Override
132
 
138
 
133
     @Override
139
     @Override
134
     public ReturnT<String> registryRemove(RegistryParam registryParam) {
140
     public ReturnT<String> registryRemove(RegistryParam registryParam) {
135
-        xxlJobRegistryDao.registryDelete(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
141
+        int ret = xxlJobRegistryDao.registryDelete(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
142
+        if (ret == 1) {
143
+            List<XxlJobGroup> autoRegisterGroups = xxlJobGroupDao.findAutoRegisterGroupByAppName(registryParam.getRegistryKey());
144
+            removeRegisterFromGroups(autoRegisterGroups, registryParam.getRegistryValue());
145
+        }
136
         return ReturnT.SUCCESS;
146
         return ReturnT.SUCCESS;
137
     }
147
     }
138
 
148
 
149
+    private void removeRegisterFromGroups(List<XxlJobGroup> groups, String address) {
150
+        if (StringUtils.isEmpty(address)) {
151
+            return;
152
+        }
153
+        if (CollectionUtils.isEmpty(groups)) {
154
+            return;
155
+        }
156
+
157
+        for (XxlJobGroup group : groups) {
158
+            List<String> addressList = group.getRegistryList();
159
+            if (addressList == null) {
160
+                continue;
161
+            }
162
+            if (!addressList.contains(address)) {
163
+                continue;
164
+            }
165
+
166
+            addressList.remove(address);
167
+            String newAddressListStr = StringUtils.collectionToCommaDelimitedString(addressList);
168
+            String oldAddressListStr = group.getAddressList();
169
+            int update = xxlJobGroupDao.updateAddressListById(group.getId(), newAddressListStr);
170
+            if (logger.isDebugEnabled()) {
171
+                logger.debug("update group name [{}] title [{}] old address list [{}] new address list [{}] update result [{}]",
172
+                        group.getAppName(), group.getTitle(), oldAddressListStr, newAddressListStr, update);
173
+            }
174
+        }
175
+    }
176
+
139
 }
177
 }

+ 13 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml 查看文件

27
 		ORDER BY t.order ASC
27
 		ORDER BY t.order ASC
28
 	</select>
28
 	</select>
29
 
29
 
30
+	<select id="findAutoRegisterGroupByAppName" resultMap="XxlJobGroup">
31
+		SELECT <include refid="Base_Column_List" />
32
+		FROM xxl_job_group AS t
33
+		WHERE `app_name` = #{appName}
34
+		AND `address_type` = 0
35
+	</select>
36
+
30
 	<select id="findByAddressType" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
37
 	<select id="findByAddressType" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
31
 		SELECT <include refid="Base_Column_List" />
38
 		SELECT <include refid="Base_Column_List" />
32
 		FROM xxl_job_group AS t
39
 		FROM xxl_job_group AS t
49
 		WHERE id = #{id}
56
 		WHERE id = #{id}
50
 	</update>
57
 	</update>
51
 
58
 
59
+	<update id="updateAddressListById">
60
+		UPDATE xxl_job_group
61
+		SET `address_list` = #{addressList}
62
+		WHERE id = #{id}
63
+	</update>
64
+
52
 	<delete id="remove" parameterType="java.lang.Integer" >
65
 	<delete id="remove" parameterType="java.lang.Integer" >
53
 		DELETE FROM xxl_job_group
66
 		DELETE FROM xxl_job_group
54
 		WHERE id = #{id}
67
 		WHERE id = #{id}

+ 3 - 3
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java 查看文件

86
         initRpcProvider(ip, port, appName, accessToken);
86
         initRpcProvider(ip, port, appName, accessToken);
87
     }
87
     }
88
     public void destroy(){
88
     public void destroy(){
89
+        // destory executor-server
90
+        stopRpcProvider();
91
+
89
         // destory jobThreadRepository
92
         // destory jobThreadRepository
90
         if (jobThreadRepository.size() > 0) {
93
         if (jobThreadRepository.size() > 0) {
91
             for (Map.Entry<Integer, JobThread> item: jobThreadRepository.entrySet()) {
94
             for (Map.Entry<Integer, JobThread> item: jobThreadRepository.entrySet()) {
102
         // destory TriggerCallbackThread
105
         // destory TriggerCallbackThread
103
         TriggerCallbackThread.getInstance().toStop();
106
         TriggerCallbackThread.getInstance().toStop();
104
 
107
 
105
-        // destory executor-server
106
-        stopRpcProvider();
107
-
108
         // destory invoker
108
         // destory invoker
109
         stopInvokerFactory();
109
         stopInvokerFactory();
110
     }
110
     }