目的:分析xxl-job执行器的注册过程
流程:
- 获取执行器中所有被注解(
@xxlJjob
)修饰的handler
- 执行器注册过程
- 执行器中任务执行过程
版本:xxl-job 2.3.1
建议:下载xxl-job
源码,按流程图debug
调试,看堆栈信息并按文章内容理解执行流程。
完整流程图:
查找Handler任务
部分流程图:
首先启动管理台界面(服务XxlJobAdminApplication
),然后启动项目中给的执行器实例(SpringBoot)
;
这个方法是扫描项目中使用@xxlJob
注解的所有handler方法。接着往下走
private void initJobHandlerMethodRepository(ApplicationContext applicationContext) {
if (applicationContext == null) {
return;
}
//获取该项目中所有的bean,然后遍历
String[] beanDefinitionNames = applicationContext.getBeanNamesForType(Object.class, false, true);
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
Map<Method, XxlJob> annotatedMethods = null; // referred to :org.springframework.context.event.EventListenerMethodProcessor.processBean
try {
annotatedMethods = MethodIntrospector.selectMethods(bean.getClass(),
new MethodIntrospector.MetadataLookup<XxlJob>() {
//注意点★
@Override
public XxlJob inspect(Method method) {
return AnnotatedElementUtils.findMergedAnnotation(method, XxlJob.class);
}
});
} catch (Throwable ex) {
logger.error("xxl-job method-jobhandler resolve error for bean[" + beanDefinitionName + "].", ex);
}
//没有跳过本次循环继续
if (annotatedMethods==null || annotatedMethods.isEmpty()) {
continue;
}
//获取了当前执行器中所有@xxl-job的方法,获取方法以及对应的初始化和销毁方法
for (Map.Entry<Method, XxlJob> methodXxlJobEntry : annotatedMethods.entrySet()) {
Method executeMethod = methodXxlJobEntry.getKey();
XxlJob xxlJob = methodXxlJobEntry.getValue();
// regist
registJobHandler(xxlJob, bean, executeMethod);
}
}
}
复制代码
在<