xxl-job 执行器分析:
一: 启动配置初始化:
启动的时候,通过配置类XxlJobConfig ,构造完单例对象后通过XxlJobSpringExecutor类的afterSingletonsInstantiated进行初始化操作。
@Override
public void afterSingletonsInstantiated() {
// init JobHandler Repository
/*initJobHandlerRepository(applicationContext);*/
// init JobHandler Repository (for method)
initJobHandlerMethodRepository(applicationContext);
// refresh GlueFactory
GlueFactory.refreshInstance(1);
// super start
try {
super.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
1:初时化执行器配置:initJobHandlerMethodRepository(applicationContext);将@XxlJob 注解修饰的所有任务加载进内存当中。
public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
logger.info(">>>>>>>>>>> xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
return jobHandlerRepository.put(name, jobHandler);
}
2:调用父类start方法初始化配置
// ---------------------- start + stop ----------------------
public void start() throws Exception {
// init logpath
XxlJobFileAppender.initLogPath(logPath);
// init invoker, admin-client
//将调度中心请求封装成实体加载进内存中
initAdminBizList(adminAddresses, accessToken);
// init JobLogFileCleanThread
JobLogFileCleanThread.getInstance().start(logRetentionDays);
// init TriggerCallbackThread
TriggerCallbackThread.getInstance().start();
// init executor-server
//通过netty绑定端口开起服务监听调度中心过来的任务请求
initEmbedServer(address, ip, port, appname, accessToken);
}
initEmbedServer通过netty绑定端口开起服务监听调度中心过来的任务请求。请求收到后处理类为;ExecutorBizImpl (自研Rpc实现),
举例:其中run接口收到调度中心请求处理:判断类型后首次创建jobThread,并且start启动,然后放入内存jobThreadRepository中,将本次请求参数体放入线程队列中等待轮训执行
//创建job并加载进内存
public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){
JobThread newJobThread = new JobThread(jobId, handler);
newJobThread.start();
logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobId:{}, handler:{}", new Object[]{jobId, handler});
JobThread oldJobThread = jobThreadRepository.put(jobId, newJobThread); // putIfAbsent | oh my god, map's put method return the old value!!!
if (oldJobThread != null) {
oldJobThread.toStop(removeOldReason);
oldJobThread.interrupt();
}
return newJobThread;
}
//放入job内置的队列中
public ReturnT<String> pushTriggerQueue(TriggerParam triggerParam) {
// avoid repeat
if (triggerLogIdSet.contains(triggerParam.getLogId())) {
logger.info(">>>>>>>>>>> repeate trigger job, logId:{}", triggerParam.getLogId());
return new ReturnT<String>(ReturnT.FAIL_CODE, "repeate trigger job, logId:" + triggerParam.getLogId());
}
triggerLogIdSet.add(triggerParam.getLogId());
triggerQueue.add(triggerParam);
return ReturnT.SUCCESS;
}
3:jobhander注册
initEmbedServer中开启端口监听后,startRegistry(appname, address);xxl_Rpc异步处理
//将之前加载的clint发送
@Override
public ReturnT<String> registry(RegistryParam registryParam) {
return XxlJobRemotingUtil.postBody(addressUrl + "api/registry", accessToken, timeout, registryParam, String.class);
}