xxl-job 的执行过程及其任务监控机制

下面是 xxl-job 的执行过程及其任务监控机制:

  1. xxl-job 的任务调度中心主要通过三个模块进行任务调度:任务调度中心、执行器和任务注册中心。

  2. 任务注册中心被用来存储和管理任务元数据,包括任务配置、执行日志等信息。任务调度中心通过查询任务注册中心的接口,以便及时地更新任务的状态、执行日志等信息。

  3. 执行器是运行在分布式环境下的任务执行客户端,用来执行具体的任务逻辑。执行器通过向任务调度中心注册任务,将任务的执行权交给调度中心,并通过反向注册方式向任务调度中心发送执行结果。

  4. 任务调度中心通过调度算法,按照任务的优先级和任务执行计划,将任务分发到相应的执行器上执行。

  5. 对于新增加的任务,任务调度中心需要及时感知任务的变化,并更新任务到任务队列中。为此,xxl-job 会定时监控任务表的变化情况,以保证任务调度的准确性。

具体来说,xxl-job 任务调度中心会定时检查任务表的变化情况,这个时间间隔默认为 3 秒。如果任务表有新的任务添加或者任务状态发生变化,任务调度中心会根据任务的执行计划和优先级,更新任务队列中的任务执行状态,并将任务分发到相应的执行器上执行。这样,就保证了任务的及时性和准确性。

在查看源码之前,需要明确一点,xxl-job 的监控任务表变化的时间间隔是可以配置的,默认值是 3 秒,但是可以通过修改配置文件 application.properties 来进行修改。修改的具体方式是在该配置文件中添加以下内容:

xxl.job.admin.addresses=http://your-admin-address:port
xxl.job.executor.appname=your-app-name
xxl.job.executor.logpath=your-job-log-path
xxl.job.executor.logretentiondays=your-log-retention-days
xxl.job.trigger.regular.time=3  # 配置任务表变化监控时间间隔为3

其中 xxl.job.trigger.regular.time 是用来配置监控任务表变化的时间间隔的,这里将其设置为了 3 秒。

关于源码部分,xxl-job 的任务调度中心模块中有一个名为 XxlJobTimer.java 的类,其中 timer 对象就是用来实现任务表监控的定时器,并且其初始值也是 3 秒:

public class XxlJobTimer {

    private static Timer timer = new Timer("XxlJobTimer", true);

    // ...

    // 定时任务表,并进行调度
    public static void init() {
        // ...

        // 任务表扫描时间,单位:秒
        int DEFAULT_SCAN_SECONDS = 3;

        // 将 TimerTask 提交到 timer 中进行执行。其中 ScanJobTask 是用来扫描任务表的任务
        timer.scheduleAtFixedRate(new ScanJobTask(), 1000, DEFAULT_SCAN_SECONDS * 1000); 

        // ...
    }
}

从代码中可以看出,xxl-job 的任务表监控定时器的时间间隔是从默认值 DEFAULT_SCAN_SECONDS 变量中获取的,该变量的默认值为 3 秒(即 TIMERINTERVALMS = 3000),而且该时间间隔也是可以在配置文件中进行修改的。

当有新的任务下发过来, xxl_job_info 这个表多久被扫描一下。
当新任务被下发时,xxljobinfo 表会在多久之后被扫描到。具体答案如下:
xxl-job 的执行器(executor)通过定时任务扫描 xxljobinfo 表,获取需要执行的任务并执行。默认情况下,扫描频率是 3 秒一次,也就是说,从任务下发到 xxljobinfo 表中被扫描到的时间大约为 3 秒。当然,你也可以通过调整 xxl-job 的配置文件,改变扫描频率来增加或减少扫描时间间隔,具体的配置项如下:

xxl-job 执行器(executor)通过定时任务扫描 xxljobinfo 表获取需要执行的任务并执行,默认扫描频率是 3 秒/次。该配置项默认值为 3 秒可以在 xxl-job 项目的 executor-sample 模块中的 application.properties 文件中找到,具体如下:

# xxl-job配置:执行器任务状态日志持久化方式:0=Log4j;1=Logback;2=Slf4j;3=JdkLog;4=Console;5=File;6=无日志记录
xxl.job.executor.log-style=2
# xxl-job配置:执行器注册地址,多个注册中心逗号分隔,: "http://address""http://address01,http://address02"
xxl.job.executor.registry-list=http://127.0.0.1:8848/registry
# xxl-job配置:执行器获取任务地址,多个执行器逗号分隔,如: "http://address""http://address01,http://address02"
xxl.job.executor.address=http://127.0.0.1:9999/xxl-job-executor-sample
# xxl-job配置:执行器AppName,服务端注册的AppName保持一致
xxl.job.executor.appname=xxl-job-executor-sample
# xxl-job配置:执行器IP地址
xxl.job.executor.ip=
# xxl-job配置:执行器端口号
xxl.job.executor.port=9999
# xxl-job配置:执行器日志缓存保存天数,超过限制自动清除。限制:大于等于1;等于-1则表示不清除缓存(将缓存保存在内存中,重启即失效)
xxl.job.executor.logretentiondays=-1
# xxl-job配置:执行器扫描间隔秒数,配置为小于等于0 则不启动扫描,默认值:3
xxl.job.executor.scan-interval=3
# xxl-job配置:执行器日志文件目录,默认在跟目录下 logs/xxl-job/jobhandler(lower case) 目录下
xxl.job.executor.logpath=./logs/xxl-job/jobhandler
# xxl-job配置:执行器日志文件保存天数,默认保存30天
xxl.job.executor.logretentiondays=30
# xxl-job配置:执行器心跳间隔秒数,默认值:30
xxl.job.executor.heart-beat-rate=30
# xxl-job配置:执行器异步任务线程池大小,用于执行异步任务,如:任务超时,任务重试 负载等。默认为2,线程池的最大线程数可通过 executor.async.worker.thread.max 参数进行调整
xxl.job.executor.async.worker.thread.size=2
本作品采用《CC 协议》,转载必须注明作者和本文链接
MissYou123
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!