美文网首页
xxljob源码总结(一),客户端和服务端的基本启动流程

xxljob源码总结(一),客户端和服务端的基本启动流程

作者: 挡不住的柳Willow | 来源:发表于2020-05-25 14:30 被阅读0次

    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
      • GlueFactory.refreshInstance(1),选择一个GlueFactory,1表示SpringGlueFactory
      • super.start() 进入XxlJobExecutorXxlJobSpringExecutor的父类)的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,注入NettyHttpServerHessianSerializer、设置核心线程数和最大线程数(默认20和200)、注入ExecutorServiceRegistry,addService为 ExecutorBizImpl,然后start这个factory:
          • 实例化 HessianSerializer
          • 实例化 NettyHttpServer,设置startedCallbackstoppedCallback,并调用start启动:
            • start当中开启新的daemon线程,用factory中的核心线程数以及最大线程数设置serverHandlerPoolNettyHttpServerHandler中处理业务请求的线程池)
            • NettyHttpServerHandler初始化ServerBootStrap并启动,启动成功调用onStarted回调前面设置到NettyHttpServer里的startedCallback
              默认的startedCallback里面会实例化ExecutorServiceRegistry并启动 ExecutorRegistryThread,在这个线程中会每隔30秒对注册中心发起一次注册的请求

    服务端初始化顺序

    通过@Component的XxlJobAdminConfigafterPropertiesSet来new 一个XxlJobScheduler并执行init方法:

    • initI18n() 初始化国际化配置
    • JobRegistryMonitorHelper.getInstance().start(); 启动自动注册线程
    • JobFailMonitorHelper.getInstance().start();启动任务执行失败重试线程
    • JobTriggerPoolHelper.toStart();启动执行器线程
    • JobLogReportHelper.getInstance().start();启动日志汇报线程
    • JobScheduleHelper.getInstance().start();启动时间轮线程

    相关文章

      网友评论

          本文标题:xxljob源码总结(一),客户端和服务端的基本启动流程

          本文链接:https://www.haomeiwen.com/subject/axsyahtx.html