上海网站建设开发哪家好,报价单模板怎么做,网络培训的优点包括,seo平台有哪些目录 1. 控制面的接口2.手动触发任务2. 定时任务的实现 1. 控制面的接口
服务端包含xxl-job的管理端#xff0c;页面上的接口后端一系列的controller接口 appName是一个核心概念#xff0c;它是指执行器应用的名称#xff0c;appName是执行器的唯一标识 页面上的接口#… 目录 1. 控制面的接口2.手动触发任务2. 定时任务的实现 1. 控制面的接口
服务端包含xxl-job的管理端页面上的接口后端一系列的controller接口 appName是一个核心概念它是指执行器应用的名称appName是执行器的唯一标识 页面上的接口对应这这里一系列的controller
2.手动触发任务
触发任务的接口为 /jobinfo/trigger com.xxl.job.admin.controller.JobInfoController#triggerJob 触发任务执行的具体实现在 JobTriggerPoolHelper 其中创建了一个快触发线程池 fastTriggerPool 和一个慢触发线程池 slowTriggerPool 用于隔离较慢的响应节点。 在触发具体任务时根据jobId判断若触发该jobId的耗时在1分钟内有10次超过500ms则该jobId使用 慢线程池执行否则使用快线程池。 触发任务的关键方法为com.xxl.job.admin.core.trigger.XxlJobTrigger#trigger 分片指的是任务分片广播执行的概念当调度中心调度一个设置了分片参数的任务时任务会被拆分成多个子任务分片每个分片会被分配一个唯一的序号分片参数通常从0开始。 分片任务的处理主要还是在客户端可参考如下示例 触发任务实际上就是发起一个http请求但前中后会记录任务的执行结果、日志等信息参考方法com.xxl.job.admin.core.trigger.XxlJobTrigger#processTrigger
大体的步骤分为
保存信息至log表初始化TriggerParam数据初始化客户端的ip地址从grop中获取发起http调用参考com.xxl.job.core.biz.client.ExecutorBizClient#run收集任务触发信息将触发信息保存至log表中
2. 定时任务的实现
xxl-job中的定时任务是通过Cron表达式实现的其具体的实现可参考 com.xxl.job.admin.core.thread.JobScheduleHelper
对于定时任务的执行其实现思路是
线程异步轮询计算job的下一次执行时间线程异步轮询计算当前时间窗口内需要执行的任务并触发任务执行
根据Cron表达式计算任务的下一次执行时间 com.xxl.job.admin.core.thread.JobScheduleHelper#generateNextValidTime 在 JobScheduleHelper 维护了两个线程 scheduleThread 和 ringThread 两者分工不同
大体来讲scheduleThread是负责触发任务调度的线程周期性地检查所有的任务计划Cron表达式定义的任务如果发现有任务到达执行时间则将这些即将执行的任务放入到一个“时间轮”ringData 字段是是一个map结构ringThread会遍历时间轮检查每个槽位上是否有任务需要执行一旦发现就立即进行处理即发起调度
但实际上scheduleThread的处理有很多细节
scheduleThread 周期性从数据库中查询任务查询之前会基于数据库xxl_job_lock表实现全局锁批量获取任务信息后会便利判断当前job的下一次执行时间 若待执行任务时间早于过期了当前时间且大于5秒则进行MISFIRE触发若待执行任务时间早于当前时间不超过5秒过期了但在窗口内则进行CRON触发 由于scheduleThread周期性执行为了处理周期间需要执行的任务此处会判断所触发任务后下一次的待执行时间于当前时间相差不超过5秒也会添加到时间轮中 若待执行时间晚于当前时间还不需要执行则将当前任务添加到时间轮中 更新数据库中的job信息trigger_last_time 、 trigger_next_time 、trigger_status 释放全局锁若总耗时小于1000ms则线程sleep一段时间