执行器注册线程优化,线程销毁时主动摘除注册机器;
This commit is contained in:
parent
7bc11fcbc4
commit
837ab404b1
|
@ -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、执行器回调线程优化,线程销毁前批量回调队列中所有数据;
|
- 6、执行器回调线程优化,线程销毁前批量回调队列中数据,防止任务结果丢失;
|
||||||
- 7、执行器注册线程优化,线程销毁时主动摘除注册机器;
|
- 7、执行器注册线程优化,线程销毁时主动摘除注册机器信息,提高执行器注册的实时性;
|
||||||
|
|
||||||
### TODO LIST
|
### TODO LIST
|
||||||
- 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
|
- 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
|
||||||
|
|
|
@ -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}",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 server
|
|
||||||
if (server != null) {
|
|
||||||
try {
|
|
||||||
server.stop();
|
|
||||||
server.destroy();
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (thread.isAlive()) {
|
|
||||||
thread.interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
// destroy Registry-Server
|
// destroy Registry-Server
|
||||||
ExecutorRegistryThread.getInstance().toStop();
|
ExecutorRegistryThread.getInstance().toStop();
|
||||||
|
|
||||||
// destroy Callback-Server
|
// destroy Callback-Server
|
||||||
TriggerCallbackThread.getInstance().toStop();
|
TriggerCallbackThread.getInstance().toStop();
|
||||||
|
|
||||||
|
// destroy server
|
||||||
|
if (server != null) {
|
||||||
|
try {
|
||||||
|
server.stop();
|
||||||
|
server.destroy();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (thread.isAlive()) {
|
||||||
|
thread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
|
logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue