xxl-job-admin 核心类解析 XxlJobAdminConfig

com.xxl.job.admin.core.conf.XxlJobAdminConfig xxl-job-admin应用启动时springboot初始化的核心配置类
主要封装了一些属性:
xxl.job.i18n ===> i18n: 目前仅支持: zh_CN  zh_TC  en 三种类型
xxl.job.accessToken ===> accessToken: 用于接口验证使用
spring.mail.from ===> emailFrom: 邮件报警发送人邮箱配置
xxl.job.triggerpool.fast.max ===> triggerPoolFastMax: 快速调度线程池最大线程池参数(调度任务0-9次执行的线程都在这个线程池进行调度)
xxl.job.triggerpool.slow.max ===> triggerPoolSlowMax: 慢速调度线程池最大线程池参数(调度任务超时超过10次的线程都在这个线程池进行调度)
xxl.job.logretentiondays ===> logretentiondays: 最低7天起步,清理xxl_job_log表中的调度日志数据,默认配置的是30天

xxlJobLogDao : 操作 xxl_job_log(调度日志表) DAO
xxlJobInfoDao : 操作 xxl_job_info(任务信息表) DAO
xxlJobRegistryDao : 操作 xxl_job_registry(任务注册地址表) DAO
xxlJobGroupDao : 操作 xxl_job_group(执行器分组表) DAO
xxlJobLogReportDao : 操作 xxl_job_log_report(日志报表表) DAO
mailSender : spring内置邮件发送Bean
dataSource : 数据源
jobAlarmer : 任务报警处理类

xxlJobScheduler : xxlJob调度类
    国际化: 初始化i18n
    调度线程池: 
        fastTriggerPool: 核心线程数10,最大线程数triggerPoolFastMax(默认200,不可小于200),线程存活时间60秒,任务队列容量1000(LinkedBlockingQueue),线程工厂指定线程名称(xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-(线程的hashcode()码)),拒绝策略:抛异常(默认JDK的拒绝策略)
        slowTriggerPool: 核心线程数10,最大线程数triggerPoolSlowMax(默认100,不可小于100),线程存活时间60秒,任务队列容量2000(LinkedBlockingQueue),线程工厂指定线程名称(xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-(线程的hashcode()码)),拒绝策略:抛异常(默认JDK的拒绝策略)
    注册表监控线程池: 
        registryOrRemoveThreadPool: 核心线程数2,最大线程数10,线程存活时间30秒,任务队列容量2000(LinkedBlockingQueue),线程工厂指定线程名称(xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-(线程的hashcode()码)),拒绝策略:主线程继续执行
        registryMonitorThread: 守护线程,名称为(xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread)
            任务逻辑: 获取所有自动注册类型的执行器group(xxl_job_group)
                      执行器不为空时
                      查询注册表(xxl_job_registry)中update_time字段的值在当前时间-90秒之前的所有数据
                      如果数据存在,删除过期注册表数据
                      查询注册表(xxl_job_registry)中update_time字段的值在当前时间-90秒之后的所有数据
                      如果数据存在,遍历注册表集合数据,将RegistType是EXECUTOR的数据使用appname字段值进行分组
                      遍历执行器group集合数据,将注册表数据更新到对应的执行器分组上(xxl_job_group)
                      此线程每30秒执行一次,初始化的直接执行一次
    任务失败重试和告警处理线程:
        monitorThread: 守护线程,名称为(xxl-job, admin JobFailMonitorHelper)
            任务逻辑: 从xxl_job_log表中获取1000条状态为 非(运行中或者执行成功) 并且 告警状态为默认(0) 的数据
                      如果数据存在,遍历当前数据,一条一条处理
                      首先将日志告警状态字段(alarm_status)设置为-1(代表数据锁定),数据状态更新失败则跳过不处理
                      更新成功后从数据库中重新加载当前任务调度日志数据load(logId)
                      通过任务调度日志上的任务ID获取任务信息xxl_job_info
                      判断log上的失败重试次数大于0 代表还有重试次数,进行任务重试调度,并将重试信息更新到xxl_job_log上的trigger_msg(调度日志)字段上
                      任务重新调度过程中会更新log上的调度次数和其他job信息
                      此线程每10秒执行一次,初始化的直接执行一次
    任务完成或者超时处理线程:
        callbackThreadPool: 核心线程数2,最大线程数20,线程存活时间30秒,任务队列容量3000(LinkedBlockingQueue),线程工厂指定线程名称(xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-(线程的hashcode()码)),拒绝策略:主线程继续执行
        monitorThread: 处理任务超时的线程,守护线程,名称为(xxl-job, admin JobLosedMonitorHelper)
            任务逻辑: 线程运行时先睡眠50毫秒,等待 JobTriggerPoolHelper-init 初始化
                      查询xxl_job_log中调度code为200并且处理结果为0并且调度时间已经超过了10分钟并且注册表中没有对应地址的数据
                      SELECT
                        t.id
                      FROM
                        xxl_job_log t
                        LEFT JOIN xxl_job_registry t2 ON t.executor_address = t2.registry_value
                      WHERE
                        t.trigger_code = 200
                            AND t.handle_code = 0
                            AND t.trigger_time <= now() - 10分钟
                            AND t2.id IS NULL;
                      数据存在,将xxl_job_log中的调度结果字段更新为调度失败,日志信息为(任务结果丢失,标记失败)
                      此线程每60秒执行一次,初始化的直接执行一次
    日志报表线程:
        logrThread: 守护线程,名称为(xxl-job, admin JobLogReportHelper)
            任务逻辑: 汇总3天内的调度日志,更新对应的任务成功数,失败数,运行中数
                      如果 XxlJobAdminConfig.logretentiondays 属性大于0,并且距离上次清理日志数据已经过了一天
                      清理指定时间之前的所有log数据
                      此线程每60秒执行一次,初始化的直接执行一次
    执行调度线程:
        scheduleThread: 守护线程,名称为(xxl-job, admin JobScheduleHelper#scheduleThread)
            任务逻辑: 随机睡4000-5000毫秒
                      pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
                      定义本次计划执行的任务数,公式为: triggerPoolFastMax + triggerPoolSlowMax * 20
                      开启一个事务,自动提交设置为false
                      给 xxl_job_lock 加锁 select * from xxl_job_lock where lock_name = 'schedule_lock' for update
                      加锁成功了
                      查询xxl_job_info中任务状态是运行中并且下一次调度时间小于等于指定的时间(即将在5秒内要运行的任务)
                      如果任务存在,遍历任务
                      如果当前时间大于下次调度时间+5秒的时间,调度过期了,根据配置的调度过期策略进行处理,立即执行策略则调度任务,否则更新下一次的调度时间
                      如果当前时间大于下次调度时间,立即执行任务调度,更新下一次的调度时间,如果任务是运行中并且当前时间+5秒大于下一次的调度时间,生成0-60之间的随机秒数,放到 ringData 集合中,在更新任务的下一次调度时间
                      上述两种情况都不满足时,代表任务还早着了,生成0-60之间的随机秒数,放到 ringData 集合中,在更新任务的下一次调度时间
                      最后更新任务调度信息,trigger_last_time(上一次调度时间) trigger_next_time(下一次调度时间) trigger_status(任务状态)
                      执行没啥问题,将事务进行提交,解锁
                      preReadSuc: 控制线程休眠时间:true: 任务多休息0-1秒,false: 没啥任务,休息4-5秒
        ringThread: 守护线程,名称为(xxl-job, admin JobScheduleHelper#ringThread)
            任务逻辑: 从 ringData 中获取2个时间刻度的调度任务数据进行任务调度 每次执行随机睡眠0-1000毫秒
 

你可能感兴趣的:(xxl-job,后端)