当前位置: 首页 > 网络应用技术

XXLJOB(1)分布式计时任务的详细说明XXLJOB使用和核心调度源代码

时间:2023-03-07 17:04:45 网络应用技术

  XXLJOB是当前最受欢迎的分布式计时任务中间件。与石英相比,该代码的入侵明显少得多。无需在代码中配置作业。XXLJOBD的Admin Server组件提供了视觉UI,到作业,而执行器能够从首页配置管理非常简单易用。目前,数百家互联网公司已使用它。XXLJOB强大的任务调度能力得到了开发人员和公司的认可。XXLJOB如何工作?

  提示:总单词22922单词,阅读全文大约需要20分钟才能喝茶时间?

  XXLJOB最新依赖项:2.3.0和源代码地址:

  github-xucueli/xxl-job:分布式任务调度框架。

  XXLJOB主要包含2个核心模块:XXL-JOB-ADMIN和XXL-JOB核心。

  最新版本使用@XXLJOB注释标记作业,同时支持生命周期工作任务。

  XXLJOB的执行程序组件是作业计划的核心实现,管理员完成了周期计划。

  XXLJOB提供了两个任务执行器,称为执行人,XXLJOB通过执行人来管理所有作业的生命周期,包括作业的初始化,启动和破坏。当前的两个主要子类是XXLJOBSIMPLEEXECUTOR和XXLSPRINGEXECUTOR。

  XXLJOBSIMPLEEXECUTOR和XXLSPRINGEXECUTOR继承了XXLJOBEXECUTOR,XXLJOBEXECUTOR提供了诸如注册作业,初始化服务器和Core Methods RegistJobHandler之类的功能。

  有两种注入作业的方法:基于弹簧的豆和纯Java(弹簧框架)。

  介绍XXLJOBSPRINGEXECUTOR,并使用@Value注释来解释application.properties中的配置。

  配置application.properties文件:

  创建一个bean -class Samplexxljob。每种方法都是@xxljob标签方法的作业。使用@xxljob注释标记方法。

  也可以在不使用弹簧框架的情况下注入它。使用类加载程序调用GetResourCeastream方法来读取属性对象实例,然后初始化XXLJOBEXECUTOR的子类。init时,所有@xxljobs的类都设置为listBeans.inside中的bean。

  建议使用第二种注射方式。在分布式环境中,我们可以使用第二种方法注入,将执行程序放入JAR软件包中,然后扫描MicroService中包含@xxljob的所有bean。服务AppName CAN。

  当然,您也可以以Springboot的形式注入,但是在配置期间,我们需要在每个服务中注入XXLJOB的管理URL和执行者的所有相关信息。

  创建一个新的基础服务项目,将执行程序的公共配置放入基础服务中,然后将执行器的端口设置为:9998。

  发布到本地仓库和专用服务器,添加pom.xml配置:

  裁定订单:

  将基础服务添加到您自己的服务中:

  在application.properties文件中配置appName在用户服务中

  注入AppName和所有bean。

  工作处理器是XXLJOB中等程度的单位,它也是最终呼叫目标任务的载体。所有工作处理器均在XXLJOBEXECUTOR类中的ConcurrentHashMap中注册。地图密钥是@xxljob(value =''')值值,地图值是Ijobhandler接口的实例。

  Ijobhandler具有三个实现,分别是GlueJobHandler,MethodJobhandler和ScriptJobHandler。

  处理程序名称描述了GlueJobHandler提供胶水任务的处理器。Methodjobhandler提供常规的BEAN模式方法工作处理器。ScriptJobHandler提供脚本处理器。借助它们,MethodJobhandler基本上可以满足我们的日常开发需求。

  最新版本支持生命周期模式,提供商店并破坏存储方法。MethodHandler包含3个方法属性:执行术,inithod和Destroymethod。如何使用:

  检查MethodJobHandler,然后根据XXLJOB中定义的INIT,DESTORY和值值找到相应的方法对象。诗歌被封装在方法中。

  JobThread是线程运行作业。它可以被认为是执行工作线程载体,并将其存储在XXLJOBEXECUTOR类中的JobThreadReadRepository中。这也是一个conurthanShmap。

  注册JobHread方法,每次您注册时,JobID和JobHandler都将作为JobThread作为参数实例化。

  调用newjobthread.start()启动JobThread线程。如果作业存在于Jobadrepository中,请停止旧线程,以便仅一个线程是作业,在某些情况下避免重复任务。

  您可以调用HTTP请求以通过Postman杀死,并检查XXLJOB是否会在任务执行时重新创建一个新线程以替换旧线程。

  localhost:9998/kill是执行人提供的带有参数为{“ jobid”:2}的HTTP请求。

  调用结果:

  观察执行人的控制台:

  21:23:23.916 logback [thread-14] info com.xxl.job.core.core.thread.jobthread- >>>>>>>>>>>>>>>>>> xxl-job jobthread Stope,havecode,havecode,havecode:thread [thread-14,1010,处理程序:com.xxl.job.core.handler.impl.methodjobhandler@2d99d5a5 [com.bingbing.sh.sh.jobhandler#inituserhandler]

  您还可以按照代码查找一个新线程来替换旧线程。

  JobThread是一个自定义线程,也是@xxljob标记方法正在调用的地方。执行机制是通过反射。调用的形式是启动USEHREAD线程。在Run()方法中,Handler执行了Execute()方法,以实现目标方法的目的。

  查看以下工作示例,如何在JobThread中执行?

  在运行方法中,TriggerQueue中的TriggerParam,TriggerParam是一组启动作业的参数集。在管理页面上启动任务时,将初始化TriggerParam。下一节将提及triggerParam。

  根据调试,默认的getExeCutorTimeout()的值为0,因此直接执行Handler.execute()方法。

  在这里,我们看到了作业最终执行的位置是handler.execute(),handler.init()和handler.destory()方法中的JobThread类中的方法。

  让我们去看看XXLJOB如何触发执行任务。简而言之,如何触发JobThread的启动,以及如何通过手动控制任务在管理页面上实现Job的开始和终止?

  在控制台上执行任务,单击执行:

  核心思想:执行一次时直接触发任务,将http request /run发送给executor,netty server接收请求,执行run()方法----- executorbiz.run(triggerParam),最后输入jobhread以执行执行任务。

  然后输入JobTriggerPoolHelper的AddTrigger()方法,该方法使用线程池执行触发操作。

  然后在xxljobtrigger类中输入Process -trigger方法,然后看看主要要做什么?

  1)Init Trigger-Param,创建一个TriggerParam实例。

  4)调用executorBiz接口的运行方法将类实现为executorBizimpl

  5)输入Run()方法并执行JobThread的实例化。如果有一个与旧线程相对应的作业,则需要更换新线程。

  输入RegistJobThread并启动JobThread。

  JobThread的成功启动意味着将安排与JobID相对应的目标方法。

  任务与触发方法的执行不同。触发器一次直接调用,并且在执行程序的运行()方法中执行USEHREAD,并且需要安排启动任务以在帮助下安排。

  同时,将XXL_JOB_INFO表中的状态字段设置为1,并在后续的计时任务中判断作业状态:

  XXLJOBSCHEDULER是由Admin Server初始化的Bean。在春季生命周期初始化bean中的初始化()方法中,弹簧容器启动时将执行AfterPropertiesset()方法。

  其中,XXLJOBSCHEERER的init()方法初始化了一项作业,该作业是为了帮助在管理页面上的管理员上配置的作业。

  输入JobsCheduleHelper的start()方法,start()方法初始化2个线程:1)shindeThread,读取XXL_JOB_INFO的所有任务为1,然后通过PushingTimering(Int Ringsecond,Int JobID)Method.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put.put。按时间轮的时间,并根据Cron表达式刷新下一个执行时间。

  注意:ringdata是由时间戳中的废物计算得出的,一分钟作为比例,每秒可以用作钥匙。如果有相同的密钥,则计算值将放置在地图的值中,即列表。

  2)林文程,旋转时间旋转,取出JobID和下一个执行时间,触发触发器。

  输入schedulethread的运行方法,并执行查询xxl_job_info表状态的记录为1:

  进入推动,计时是时间轮。

  计时用于存储触发时间和JobID的组合。

  jobschedulehelper的start()方法在start()方法的方法中都将任务放在时间轮中。Ringthread的守护程序线程在时间轮中处理任务。时间轮需要螺纹旋转执行,这类似于Kafka的时间轮机构。然后触发触发。

  存储任务

  **** ringdata是一张地图,密钥是任务的时间戳。JobID是任务ID。如果在同一时间有多个任务,请使用列表存储任务ID列表。

  删除任务

  ****根据当前时间在ringdata中取出任务ID列表,然后查询任务ID列表,然后执行触发器。

  最后输入recutorBizimpl的运行()方法

  如上所述,它将输入xxljobexecutor.registjobthread(int jobid,ijobhandler处理程序,string removeOldReason)方法,jobthread start,调用目标方法,核心进程结束。

  原始:https://juejin.cn/post/709945370284376071