xxljob在开源项目的代码设计里,可以说是非常亲民了,没有多余的屌丝炫技,没有复杂的设计模式,整个流程一目了然,当然这样的缺点就是扩展性差。
客户端初始化顺序
- 用户根据官网规则,自己编写
XxlJobConfig
,其中@Bean
返回的XxlJobSpringExecutor
,实例化完成后spring回调afterPropertiesSet
初始化方法,其中分为以下几个重要步骤:-
initJobHandlerRepository(applicationContext)
, 这里会先扫描出被@JobHandler
注解的类(但是@JobHandler
的方式已经被弃用了,所以这里不做过多分析) -
initJobHandlerMethodRepository(applicationContext)
, 通过applicationContext
遍历所有的bean,遍历每个bean的method,拿到被@XxlJob
注解修饰的方法,调用registJobHandler
:- 简单地把method和object封装到一个叫做
MethodJobHandler
的对象中,然后把这个handler对象放到jobHandlerRepository
map里,后面接收到请求的时候回根据handler的名称去map中获取对应的methodJobHandler
并通过反射的方式执行method
- 简单地把method和object封装到一个叫做
-
GlueFactory.refreshInstance(1)
,选择一个GlueFactory,1表示SpringGlueFactory - super.start() 进入
XxlJobExecutor
(XxlJobSpringExecutor
的父类)的start方法:-
XxlJobFileAppender.initLogPath(logPath)
,初始化日志路径
initAdminBizList(adminAddresses, accessToken)
; 根据控制中心的地址,创建AdminBizClient
,主要用于向控制中心发送http请求,回调、注册或取消注册 -
JobLogFileCleanThread.getInstance().start(logRetentionDays)
; 启动日志文件定时清理的后台线程 -
TriggerCallbackThread.getInstance().start();
启动触发器回调线程,客户端的handler执行结束后,会将结果放入callBackQueue
,该线程在一个死循环中不断轮训callBackQueue
的任务并执行 -
initRpcProvider(ip, port, appName, accessToken);
根据配置好的ip、端口、appName来初始化XxlRpcProviderFactory
,注入NettyHttpServer
、HessianSerializer
、设置核心线程数和最大线程数(默认20和200)、注入ExecutorServiceRegistry
,addService为ExecutorBizImpl
,然后start这个factory:- 实例化
HessianSerializer
- 实例化
NettyHttpServer
,设置startedCallback
和stoppedCallback
,并调用start启动:- start当中开启新的daemon线程,用factory中的核心线程数以及最大线程数设置
serverHandlerPool
(NettyHttpServerHandler
中处理业务请求的线程池) - 用
NettyHttpServerHandler
初始化ServerBootStrap
并启动,启动成功调用onStarted
回调前面设置到NettyHttpServer
里的startedCallback
:
默认的startedCallback
里面会实例化ExecutorServiceRegistry
并启动ExecutorRegistryThread
,在这个线程中会每隔30秒对注册中心发起一次注册的请求
- start当中开启新的daemon线程,用factory中的核心线程数以及最大线程数设置
- 实例化
-
-
服务端初始化顺序
通过@Component的XxlJobAdminConfig
的afterPropertiesSet
来new 一个XxlJobScheduler
并执行init
方法:
-
initI18n()
初始化国际化配置 -
JobRegistryMonitorHelper.getInstance().start();
启动自动注册线程 -
JobFailMonitorHelper.getInstance().start();
启动任务执行失败重试线程 -
JobTriggerPoolHelper.toStart();
启动执行器线程 -
JobLogReportHelper.getInstance().start();
启动日志汇报线程 -
JobScheduleHelper.getInstance().start();
启动时间轮线程
网友评论