xxl-job学习梳理

本文详细介绍了XXLJOB执行器的初始化流程,包括配置类中的bean注入,执行器如何获取和注册标记有@XxlJob的方法,以及日志清理、触发器回调线程和内置服务器的启动。同时,阐述了调度器的初始化,包括触发器线程池的创建,执行器注册和定时任务的执行。整个流程涉及服务注册、任务调度和执行、回调处理等多个关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行器流程

  1. 配置类中注入bean:XxlJobSpringExecutor
    在这里插入图片描述

  2. XxlJobSpringExecutor实现接口SmartInitializingSingleton。在所有单例bean实例化之后,再次遍历所有单例bean,执行实现这个接口的回调方法afterSingletonsInstantiated
    在这里插入图片描述

  3. afterSingletonsInstantiated方法执行
    ①获取类中标记@XxlJob注解的方法。放入map中,key:Method,Vaule:XxlJob注解类
    ②registJobHandler(XxlJobExecutor中方法。XxlJobExecutor是XxlJobSpringExecutor的父类)。
    registJobHandler(xxlJob, bean, executeMethod);
    将Method封装为MethodJobHandler(里面包含目标类,可以直接调用方法执行)。获取XxlJob注解中的value属性,获取到执行的方法名称name。
    ③将name作为key,MehtodJobHandler作为value注入到jobHandlerRepository属性中。
    jobHandlerRepository是XxlJobExecutor的属性。类型为 ConcurrentMap<String, IJobHandler>。

  4. GlueFactory.refreshInstance(1);根据输入的参数创建一个GlueFactory类。

  5. 调用父类XxlJobExecutor的start()方法。
    ①XxlJobFileAppender.initLogPath(logPath);
      初始化logPath。初始化日志文件。如果没有指定,默认/data/applogs/xxl-job/jobhandler
    ②initAdminBizList(adminAddresses, accessToken);
      根据adminAddresses,accessToken初始化AdminBize。构建AdminBizClient,这个类可以执行Admin服务中的回调,注册,取消注册方法。里面封装了远程调用的细节。将创建的AdminBizeClient存到到XxlJobExecutor的属性adminBizList中。
      private static List adminBizList;
    ③ JobLogFileCleanThread.getInstance().start(logRetentionDays);
      JobLogFileCleanThread是一个单例类。有core包提供。它的职责就是日志文件清理。开启一个线程,定时去清理日志文件。
    ④ TriggerCallbackThread.getInstance().start();
      TriggerCallbackThread也是一个单例类。有core包提供。触发器回调,它会创建两个线程去执行轮询逻辑。
    triggerCallbackThread(触发回调线程):
       private LinkedBlockingQueue callBackQueue = new LinkedBlockingQueue();
      从回调阻塞队列里面通过阻塞方式(take方法)取出队列中一个任务。如果不为空,取出队列中所有任务放入内部的一个集合中,并清空阻塞队列。
       doCallback方法执行内部的集合中的所有任务。通过adminBiz代理,调用admin服务的回调方法。返回结果写入日志中。失败的写入到失败文件。
    triggerRetryCallbackThread(触发重试回调线程):
      重试回调线程就是从失败文件中取任务,再次执行。
    ⑤ initEmbedServer(address, ip, port, appname, accessToken);
      初始化内置服务器。初始化一个EmbedServer对象,调用该对象的start方法:
    初始化一个执行器的代理对象:
       executorBiz = new ExecutorBizImpl();
    定义一个线程,启动这个线程:
      线程中通过netty初始话流程创建一个ServerSocketChannel。监听一个端口,开启服务。
      请求处理类EmbedHttpServerHandler。
      注册服务到admin。注册通过ExecutorRegistryThread单例类执行start方法。start方法开启一个线程,如果没有终止,一直执行。run方法中通过获取adminBiz代理对象,调用对象的registry方法,向Admin注册当前executor方法。休眠30秒,继续执行。如果执行器设置stop = true,则退出while循环,通过adminBiz代理对象,调用admin的取消执行器方法。目的:将当前服务信息注册到admin。如果ip未配置,默认取当前服务的ip。数据会被保存到admin服务端的表xxl_job_registry中

  6. ExecutorBizImpl中对请求的处理
      当admin与executor建立连接。通过解码获取请求的HttpMethod,rui,requestData,accessToken。通过线程池,执行请求。
       Object responseObj = process(httpMethod, uri, requestData, accessTokenReq);
      ①基础校验,校验httpMethod,uri,accesstoken。
      ②根据uri,executorBiz代理类执行队形的方法。常用的有心跳方法,运行方法,杀死服务方法等。
      jobThread中的run方法执行:
      通过excutor中xxljob上标注的name,在xxljobexecutor类中的jobHandlerRepository属性中,通过key获取到对应的value(MehtodJobHandler)。
      注册一个job线程,放入任务的jobid(uuid唯一),jobHandler。启动job线程,异步执行请求。主流程中将请求放入到jobThread的blockQueue中。然后jobThread的run方法就从阻塞队列中取任务执行以下流程:
      ①执行handler的init方法。
      ②job线程中有一个triggerQueue队列。从队列中poll一个triggerParam,如果不为空,triggerLogIdSet集合中移除当前的traiggerParam的logId对应的记录。
      ③执行handler的executor方法。
      ④TriggerCallbackThread将封装好的方法执行结果放入到阻塞队列。有回调线程调用admin的回调方法执行。
      特殊情况。执行30次后,阻塞队列中没有任务。将jobThread从xxlJobExecutor中移除,并调用jobThread的toStop方法,调用当前线程中断。

xxljobexecutor中就保存了以下内容:
(1)jobHandlerRepository:保存xxljob注解中name和对应的MethodHandler
(2)adminBizList:保存Admin服务的adminbiz代理对象
(3)jobThreadRepository:保存处理admin请求的jobThread对象

Admin初始化流程

  1. 配置类初始化的时候执行XxlJobScheduler类的init方法。
    在这里插入图片描述
    在这里插入图片描述
  2. XxlJobScheduler的init方法
    在这里插入图片描述
    ①initI18n
      国际化。暂不研究
    ②JobTriggerPoolHelper.toStart();
      初始化触发器线程池。JobTriggerPoolHelper类中初始化两个线程池:一个快线程池,一个慢处理线程池。当任务的超时时间设置超过10秒时,我们认为其为慢任务,使用慢触发器线程池去处理,没有设置超时间和超时时间小于10s的我们认为其运行很快交由快触发器线程池处理。
    在这里插入图片描述
    ③JobRegistryHelper.getInstance().start();
      初始化注册,移除线程池初始化监听器线程,并启用这个监听器线程。
      监听器线程,while循环一直执行,更新执行器信息。
    在这里插入图片描述
    ④JobScheduleHelper.getInstance().start();
      定时任务的执行线程。从定时任务中取出任务,通过JobTriggerPoolHelper.trigger触发任务。JobTriggerPoolHelper就是上面写的里面会初始化两个线程池。定时任务里面是调用XxlJobTrigger.trigger触发任务。找到对应的执行器,processTrigger方法处理任务。通过执行器的地址信息获取执行器的代理对象executorBiz,执行run方法。

补充:2023-06-03.服务端执行器:自动注册方式的机器地址列表获取。

  客户端会定时(默认间隔30秒)将服务信息(包含服务ip和端口,执行器名称)注册到服务端的表xxl_job_registry中。
  服务端也有要给定时任务:JobRegistryHelper。执行器表xxl_job_group中查询类型为自动注册类型的执行器。然后根据执行器名称去JobRegistryHelper表中查找默认90s还存活的机器地址。更新到表xxl_job_group中对应的执行器上。

### 回答1: 你好!xxl-job 是一个开源的分布式任务调度平台,它支持定时任务和流式任务的调度执行,并且可以跨平台、跨语言地使用。 使用 xxl-job 首先需要搭建一个调度中心,然后在需要调度的应用中引入相应的依赖,配置任务并注册到调度中心。调度中心会定时触发任务执行,并将任务执行结果返回给应用。 具体的使用方法可以参考 xxl-job 的官方文档和示例代码。如果还有其他问题或疑问,欢迎继续询问。 ### 回答2: @xxljob是一种常见的Java注解,用于实现定时任务调度。它是基于Quartz框架的二次封装,简化了任务调度的配置和使用。 使用@xxljob注解时,需要在需要被调度的方法上加上该注解,并配置一些参数。 如下是常见的配置选项: 1. value:设置定时任务的名称。 2. cron:设置任务触发的时间规则,使用Cron表达式来指定。例如,"0/5 * * * * ?" 表示每隔5秒触发一次。 3. desc:设置任务描述,可选参数,用于描述该定时任务的作用或者内容。 4. owner:设置任务的负责人,可选参数,用于标识任务的负责人。 @xxljob注解的使用步骤如下: 1. 导入所需的依赖。在pom.xml文件中添加xxl-job-core的依赖。 2. 在任务所在的类中,将需要被调度的方法上加上@xxljob注解,并配置相应的参数。 3. 在Spring配置文件中,配置xxl-job的调度中心地址等相关信息。 4. 启动项目后,xxl-job会自动的扫描被@xxljob注解标记的方法,并根据配置的时间规则触发任务的执行。 @xxljob注解的使用使得任务调度的配置更加简单和灵活,无需繁琐的XML配置,而且支持多种时间规则的设置,方便开发人员根据实际需求灵活定制任务调度策略。并且,@xxljob注解还提供了管理界面,方便查看任务的执行情况和管理任务的状态。 总之,@xxljob注解的使用可以简化定时任务调度的配置,提高开发效率,是Java开发中常用的注解之一。 ### 回答3: @xxljob是一种基于Java的任务调度框架,用于构建分布式任务调度系统。它的主要作用是实现定时调度任务,可以按照指定的时间间隔或者时间点触发任务的执行。 @xxljob注解的使用方式是在需要定时执行的方法上添加注解,在指定的时间点或者时间间隔触发方法执行。使用@xxljob注解的方法需要满足一定的条件,比如需要定义为public、static、无参无返回值的方法。注解还可以定义执行策略,如定时执行 or 延迟执行、失败重试策略等。 @xxljob注解的功能非常强大,可以满足各种任务调度的需求。它提供了丰富的定时任务配置选项,如每天、每周、每月定时执行,还可以指定任务超时时间、执行器路由策略等。 使用@xxljob注解还可以实现分布式任务调度,通过配置多个执行器节点,在不同的服务器上执行任务,提高任务执行效率和稳定性。而且@xxljob还提供了任务监控和管理界面,可以查看任务的执行状态、结果等信息。 总之,@xxljob注解使用简单灵活,可以方便地实现任务调度功能,提高系统的稳定性和可维护性。同时它还支持分布式部署,适用于大规模的任务调度场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值