Переглянути джерело

执行器注册线程优化,线程销毁时主动摘除注册机器;

xuxueli 8 роки тому
батько
коміт
837ab404b1

+ 5 - 3
doc/XXL-JOB官方文档.md

@@ -739,8 +739,10 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
 自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
 自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
 
 
     AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;
     AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;
-    Beat: 任务注册心跳周期, 默认15s; 执行器以一倍Beat进行执行器注册, 调度中心以一倍Beat进行动态任务发现; 注册信息的失效时间被两倍Beat; 
     注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表;
     注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表;
+    执行器注册: 任务注册Beat周期默认30s; 执行器以一倍Beat进行执行器注册, 调度中心以一倍Beat进行动态任务发现; 注册信息的失效时间被三倍Beat; 
+    执行器注册摘除:执行器销毁时,将会主动上报调度中心并摘除对应的执行器机器信息,提高心跳注册的实时性;
+    
 
 
 为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
 为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
 
 
@@ -986,8 +988,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
 - 3、新增JFinal类型执行器sample示例项目;
 - 3、新增JFinal类型执行器sample示例项目;
 - 4、执行器手动设置IP时将会绑定Host;
 - 4、执行器手动设置IP时将会绑定Host;
 - 5、项目主页搭建,提供中英文文档;
 - 5、项目主页搭建,提供中英文文档;
-- 6、执行器回调线程优化,线程销毁前批量回调队列中所有数据;
-- 7、执行器注册线程优化,线程销毁时主动摘除注册机器;
+- 6、执行器回调线程优化,线程销毁前批量回调队列中数据,防止任务结果丢失
+- 7、执行器注册线程优化,线程销毁时主动摘除注册机器信息,提高执行器注册的实时性
 
 
 ### TODO LIST
 ### TODO LIST
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java

@@ -73,7 +73,7 @@ public class AdminBizImpl implements AdminBiz {
                                 childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
                                 childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
                                         (i+1), childJobKeys.length, childJobKeys[i], ret, childJobInfo.getJobDesc());
                                         (i+1), childJobKeys.length, childJobKeys[i], ret, childJobInfo.getJobDesc());
                             } catch (SchedulerException e) {
                             } catch (SchedulerException e) {
-                                logger.error("", e);
+                                logger.error(e.getMessage(), e);
                             }
                             }
                         } else {
                         } else {
                             childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务xxlJobInfo不存在, 子任务Key: {2}",
                             childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务失败, 子任务xxlJobInfo不存在, 子任务Key: {2}",

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java

@@ -132,12 +132,12 @@ public class XxlJobServiceImpl implements XxlJobService {
             //XxlJobDynamicScheduler.pauseJob(qz_name, qz_group);
             //XxlJobDynamicScheduler.pauseJob(qz_name, qz_group);
             return ReturnT.SUCCESS;
             return ReturnT.SUCCESS;
         } catch (SchedulerException e) {
         } catch (SchedulerException e) {
-            logger.error("", e);
+            logger.error(e.getMessage(), e);
             try {
             try {
                 xxlJobInfoDao.delete(jobInfo.getId());
                 xxlJobInfoDao.delete(jobInfo.getId());
                 XxlJobDynamicScheduler.removeJob(qz_name, qz_group);
                 XxlJobDynamicScheduler.removeJob(qz_name, qz_group);
             } catch (SchedulerException e1) {
             } catch (SchedulerException e1) {
-                logger.error("", e1);
+                logger.error(e.getMessage(), e1);
             }
             }
             return new ReturnT<String>(ReturnT.FAIL_CODE, "新增任务失败:" + e.getMessage());
             return new ReturnT<String>(ReturnT.FAIL_CODE, "新增任务失败:" + e.getMessage());
         }
         }
@@ -207,7 +207,7 @@ public class XxlJobServiceImpl implements XxlJobService {
             boolean ret = XxlJobDynamicScheduler.rescheduleJob(qz_group, qz_name, exists_jobInfo.getJobCron());
             boolean ret = XxlJobDynamicScheduler.rescheduleJob(qz_group, qz_name, exists_jobInfo.getJobCron());
             return ret?ReturnT.SUCCESS:ReturnT.FAIL;
             return ret?ReturnT.SUCCESS:ReturnT.FAIL;
         } catch (SchedulerException e) {
         } catch (SchedulerException e) {
-            logger.error("", e);
+            logger.error(e.getMessage(), e);
         }
         }
 
 
 		return ReturnT.FAIL;
 		return ReturnT.FAIL;

+ 1 - 1
xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java

@@ -115,7 +115,7 @@ public class ExecutorBizImpl implements ExecutorBiz {
                     IJobHandler originJobHandler = GlueFactory.getInstance().loadNewInstance(triggerParam.getGlueSource());
                     IJobHandler originJobHandler = GlueFactory.getInstance().loadNewInstance(triggerParam.getGlueSource());
                     jobHandler = new GlueJobHandler(originJobHandler, triggerParam.getGlueUpdatetime());
                     jobHandler = new GlueJobHandler(originJobHandler, triggerParam.getGlueUpdatetime());
                 } catch (Exception e) {
                 } catch (Exception e) {
-                    logger.error("", e);
+                    logger.error(e.getMessage(), e);
                     return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
                     return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
                 }
                 }
             }
             }

+ 9 - 9
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java

@@ -55,9 +55,9 @@ public class JettyServer {
 					server.join();	// block until thread stopped
 					server.join();	// block until thread stopped
 					logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
 					logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
 				} catch (Exception e) {
 				} catch (Exception e) {
-					logger.error("", e);
+					logger.error(e.getMessage(), e);
 				} finally {
 				} finally {
-					destroy();
+					//destroy();
 				}
 				}
 			}
 			}
 		});
 		});
@@ -67,25 +67,25 @@ public class JettyServer {
 
 
 	public void destroy() {
 	public void destroy() {
 
 
+		// destroy Registry-Server
+		ExecutorRegistryThread.getInstance().toStop();
+
+		// destroy Callback-Server
+		TriggerCallbackThread.getInstance().toStop();
+
 		// destroy server
 		// destroy server
 		if (server != null) {
 		if (server != null) {
 			try {
 			try {
 				server.stop();
 				server.stop();
 				server.destroy();
 				server.destroy();
 			} catch (Exception e) {
 			} catch (Exception e) {
-				logger.error("", e);
+				logger.error(e.getMessage(), e);
 			}
 			}
 		}
 		}
 		if (thread.isAlive()) {
 		if (thread.isAlive()) {
 			thread.interrupt();
 			thread.interrupt();
 		}
 		}
 
 
-		// destroy Registry-Server
-		ExecutorRegistryThread.getInstance().toStop();
-
-		// destroy Callback-Server
-		TriggerCallbackThread.getInstance().toStop();
-
 		logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
 		logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
 	}
 	}
 
 

+ 8 - 0
xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java

@@ -99,6 +99,7 @@ public class ExecutorRegistryThread extends Thread {
                 } catch (Exception e) {
                 } catch (Exception e) {
                     logger.error(e.getMessage(), e);
                     logger.error(e.getMessage(), e);
                 }
                 }
+                logger.warn(">>>>>>>>>>>> xxl-job, executor registry thread destory.");
 
 
             }
             }
         });
         });
@@ -108,6 +109,13 @@ public class ExecutorRegistryThread extends Thread {
 
 
     public void toStop() {
     public void toStop() {
         toStop = true;
         toStop = true;
+        // interrupt and wait
+        registryThread.interrupt();
+        try {
+            registryThread.join();
+        } catch (InterruptedException e) {
+            logger.error(e.getMessage(), e);
+        }
     }
     }
 
 
 }
 }

+ 8 - 0
xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java

@@ -80,6 +80,7 @@ public class TriggerCallbackThread {
                 } catch (Exception e) {
                 } catch (Exception e) {
                     logger.error(e.getMessage(), e);
                     logger.error(e.getMessage(), e);
                 }
                 }
+                logger.warn(">>>>>>>>>>>> xxl-job, executor callback thread destory.");
 
 
             }
             }
         });
         });
@@ -88,6 +89,13 @@ public class TriggerCallbackThread {
     }
     }
     public void toStop(){
     public void toStop(){
         toStop = true;
         toStop = true;
+        // interrupt and wait
+        triggerCallbackThread.interrupt();
+        try {
+            triggerCallbackThread.join();
+        } catch (InterruptedException e) {
+            logger.error(e.getMessage(), e);
+        }
     }
     }
 
 
     /**
     /**

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

@@ -62,7 +62,7 @@ public class HttpClientUtil {
 				EntityUtils.consume(entity);
 				EntityUtils.consume(entity);
 			}
 			}
 		} catch (Exception e) {
 		} catch (Exception e) {
-			logger.error("", e);
+			logger.error(e.getMessage(), e);
 			throw e;
 			throw e;
 		} finally {
 		} finally {
 			httpPost.releaseConnection();
 			httpPost.releaseConnection();