对调度任务的一点理解

【FreeRTOS】任务调度机制 FreeRTOS之任务调度 不同于前后台轮询系统,FreeRTOS正是使用任务调度机制来选择某个任务运行。那么到底如何选择任务,就需要根据任务的优先级的状态来决定。 文章目录FreeRTOS之任务调度1 【优先级与任务状态】1.1 [优先级]1.2 [任务状态]2 【任务链表】3 【如何管理?】3.1 [如何找到最高优先级的运行态任务]3.2 [pxReadyTaskLists就绪任务优先级数组]4 【谁进行调度?】5 【通过链表理解调度机制】5.1 [空闲任务礼让] 1 【优先级与任务状态】 1.1 [优 阅读详情

在如今的企业级开发当中,Spring+Quartz整合实现定时任务调度是必不可少的,因此就在这做个简单的整理,方便日后查阅。

●介绍 

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。 

Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。 

●定时器种类 

Quartz 中五种类型的 Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,NthIncludedDayTrigger和Calendar 类( org.quartz.Calendar)。

Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述:

●Job

是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中;

●JobDetail

Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group, java.lang.ClassjobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;

●Trigger

是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

●Calendar

org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。

假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触发机制的基础上使用Calendar进行定点排除。针对不同时间段类型,Quartz在org.quartz.impl.calendar包下提供了若干个Calendar的实现类,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周进行定义;

●Scheduler

代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;

●ThreadPool

Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会影响下次的执行。而有状态任务共享共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。

正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行,这意味着如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素,程序往往拥有更高的复杂度,因此除非必要,应该尽量使用无状态的Job。

如果Quartz使用了数据库持久化任务调度信息,无状态的JobDataMap仅会在Scheduler注册任务时保持一次,而有状态任务对应的JobDataMap在每次执行任务后都会进行保存。

Trigger自身也可以拥有一个JobDataMap,其关联的Job可以通过JobExecutionContext#getTrigger().getJobDataMap()获取Trigger中的JobDataMap。不管是有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMap所做的更改都不会进行持久,也即不会对下次的执行产生影响。

Quartz拥有完善的事件和监听体系,大部分组件都拥有事件,如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等等,可以注册相应的监听器处理感兴趣的事件。

●SimpleTrigger

SimpleTrigger拥有多个重载的构造函数,用以在不同场合下构造出对应的实例:

●SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;

●SimpleTrigger(String name, String group, Date startTime):除指定Trigger所属组和名称外,还可以指定触发的开发时间;

●SimpleTrigger(String name, String group, Date startTime, Date endTime, int repeatCount, long repeatInterval):除指定以上信息外,还可以指定结束时间、重复执行次数、时间间隔等参数;

●SimpleTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, int repeatCount, long repeatInterval):这是最复杂的一个构造函数,在指定触发参数的同时,还通过jobGroup和jobName,让该Trigger和Scheduler中的某个任务关联起来。

没有代码的描述总感觉枯燥无味:

/**
 * 添加调度任务
 *
 * @param scheduleJob
 * @return
 */
@PostMapping(value = "/save")
@ApiOperation(value = "添加调度任务", notes = "添加调度任务")
@ApiImplicitParams({
        @ApiImplicitParam(name = "authorization", value = "authorization", required = true, dataType = "string", paramType = "header"),
})
public ResponseResult saveJob(HttpServletRequest request, @RequestBody ScheduleJob scheduleJob) {

    //获取不进行xss过滤的request对象
    HttpServletRequest orgRequest = XssHttpServletRequestWrapper.getOrgRequest(request);

    log.debug("添加调度任务参数! scheduleJob = {}", scheduleJob);

    //判断任务是否已经存在相同的jobName和jobGroup
    ScheduleJob record = scheduleJobService.findByJobNameAndJobGroup(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    if (null != record) {
        return new ResponseResult(ResponseResult.Status.FAILURE, "改调度任务已被注册!");
    }

    scheduleJob.setRemoteUrl(orgRequest.getParameter("remoteUrl"));
    scheduleJobService.saveScheduleJob(scheduleJob, user);

    log.info("添加调度任务成功! jobId = {}", scheduleJob.getId());
    return new ResponseResult(ResponseResult.Status.SUCCESS, "添加成功!");
}

Quartz专栏系列

quartz官方文档

quartz学习





Spark中Yarn资源调度与任务调度详解 1)Application:基于spark的应用程序,包含了Driver程序和集群上的Executor2)Executor:是在一个WorkNode上为某应用启动的一个进程,该进程负责运行任务,并且将数据存储在内存或者磁盘上。每一个应用都有各自独立的Executors3)Task:是一个线程对象,是被送到某个Executor上的执行单元4)DriverProgram:运行main函数并新建SparkContext的程序5)ClusterManager:在集群上获取资源的外部服务。 阅读详情

相关推荐

鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元

只有大家等领导,哪有领导等你们的道理,所以工作要提前准备好,每个部门的优先级又不一样,所以每个部门都要有个任务队列,里面放的是领导能直接处理的任务,没准备好的不要放进来,因为这是给CPU提前准备好的粮食!为程序计数器,用于保存程序的执行地址,在ARM的三级流水线架构中,程序流水线包括取址、译码和执行三个阶段,PC指向的是当前取址的程序地址,所以32位ARM中,译码地址(正在解析还未执行的程序)为PC-4,执行地址(当前正在执行的程序地址)为PC-8, 当突然发生中断的时候,保存的是PC的地址。

maniuT的博客 1420

深入探究RTOS的任务调度

阅读引言: 此文将会从一个过程文件, 一步一步的分析RTOS的任务调度实现, 这里选用FreeRTOS分析, 别的也差不多的, 可能在细节上有少许不一样。

m0_74976404的博客 2942

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 484

问题 A: 任务调度

题目描述 读入任务调度序列,输出n个任务适合的一种调度方式。 输入 输入包含多组测试数据。 每组第一行输入一个整数n(n<100000),表示有n个任务。 接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。 输出 输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。 样例输入 ...

weixin_43886377的博客 293

智能气象站:ESP32驱动的心知天气数据可视化实践

本文详细介绍了基于ESP32微控制器和心知天气API构建智能气象站的完整实践。通过Arduino开发环境,实现天气数据的获取、JSON解析与OLED屏可视化展示,涵盖硬件连接、API配置、低功耗优化及部署问题排查,为物联网开发者提供实用指南。

jump7的博客 210

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

weixin_37584728的博客 4735

扫盲系列(12):数据仓库实践之任务调度

本文介绍了数据仓库实践需要任务调度的主要原因、常见的任务调度执行方式和任务调度工具。

oOBubbleX的博客 1008

yolov5部署之七步完成tensorRT模型推理加速

目录前言step 1. 下载yolov5源码以及tensorrtx源码,并将yolov5s.pt转为.wts模型step 2. 确定并下载自己准备使用的CUDA版本。step 3. 根据自己的CUDA版本下载对应版本的cuDNN以及TensorRTstep 4. 根据自己使用的VS版本下载对应版本的OpenCVstep 5. 安装CUDAstep 6. 安装cuDNN、TensorRT以及验证TensorRT是否安装成功 前言     前段时间研究了Pytorch的环境配置,之后便从github上下载了yo

Christo的博客 4万+

什么是任务调度

我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,设置某几个时间点进行分批放票。 某网站为了实现天气实时展示,每隔10分钟就去天气服务器获取最新的实时天气信息。 以上业务场景的解决方案就是任务调度。 任务调度是指系统为了自动完成特定任务,在约定的特定时

Leon_Jinhai_Sun的博客 8558

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 157

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

Codeup:1985 任务调度

题目描述 读入任务调度序列,输出n个任务适合的一种调度方式。 输入 输入包含多组测试数据。 每组第一行输入一个整数n(n<100000),表示有n个任务。 接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。 输出 输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。 样例输入 Copy 4 Task0(Task1,Task2) Task1(Task3) Task2(NULL) Task3

weixin_45981887的博客 545

智能硬件产品:做好一款电子硬件产品,工具必不可少

上到战略规划,中至运营策略,下至人性洞察,。最初做产品时,笔者从一开始就陷入到了对工具的痴迷,包括:PS、AutoCAD、PROE、犀牛、Axure、Keyshot、Altium……大概将 2 个多月的时间和精力都消耗在了学习使用工具上。通过工具的运用也确实提高了工作效率,在仅有创意的前提下通过灵活运用工具,一年内便成功申请了多个实用新型专利、设计了多款产品的高保真原型图等。正在上传…重新上传取消。

产品线负责人 1443

Java定时器、任务调度工具详解(Quartz 任务调度)

1.什么是任务调度 任务调度:根据时间,执行任务。 比如: (1)比如生活中的闹钟,我们设置闹钟每天早上七点执行响铃操作。我们给这个闹钟设定了时间,并且也给它设置了要进行执行的具体任务。关于这样的业务我们就称之为任务调度。 (2)假如在一个电商项目中,当用户在选择商品加入订单车后,如果在两个小时内没有支付,那么就自动会被取消掉。关于这样的功能我们如何去解决呢? 解决方案: 每十分钟扫描一下订单,...

小杰爱吃蛋的博客 2020

AutoSAR系列讲解(实践篇)7.3-AppL在Dev中的配置(下)

接着讲解Dev中剩下的几个定义项

雪云飞星的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

对uC/OS-II任务调度过程的一点粗浅理解

uC/OS-II的任务一般格式为(我用的是ZLG的):http://blog.baisi.net/?192911/viewspace-3727 void TASKn(void *pdata) { pdata = pdata; while (1) { OSTimeDly(OS_TICKS_PER_SEC); } } ucos-II是基于任务优先级抢占式任务调

润泽海色的博客 1463

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

cron 晚上十一点半 和十点半

cron = “0 30 22 * * ? *” ----十点半 cron = “0 30 23 * * ? *” -----十一点半

m0_45421674的博客 6671

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ucos任务调度理解

任务状态 任务控制块 任务控制块OS_TCB是一个数据结构 保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。 任一旦任务建立了,任务控制块OS_TCBs将被赋值 任务建立的时候,OS_TCBs被初始化了 当任务的CPU使用权被剥夺时,μC/0S-Il 用它来保存该任务的状态。 当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那上点丝毫不差地继续...

某风吾起的博客 3596

FreeRTOS-实现任务调度器

本文正式开启对FreeRTOS内核的研究,首当其冲的就是就是任务调度器的实现,任务调度器作为FreeRTOS的核心,因为FreeRTOS的本质就是任务的轮流运行,为了循序渐进的学习,避免一口吃成一个大胖子,本文只实现两个任务的切换,先不管任务的优先级,本文的目的就是将任务切换的全过程分析的透透彻彻,在此之前要深入理解FreeRTOS链表操作,还有ARM架构的知识,我已经帮你们总结好了。《FreeRTOS-链表的源码解析》《FreeRTOS-ARM架构与程序的本质》《FreeRTOS-ARM架构深入理解》

k666499436的博客 1万+

FreeRTOS - 任务调度

FreeRTOS学习过程中内容整理:综合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源整理而得。

luckyme_的博客 6951

FREERTOS任务调度和切换

我们已经学会了FreeRTOS的任务创建和删除,挂起和恢复等基本操作,并且也学习了分析FreeRTOS源码所必须掌握的知识:列表和列表项。但是任务究竟如何被创建、删除、挂起和恢复的?系统是怎么启动的等等这些我们还不了解,一个操作系统最核心的内容就是多任务管理,所以我们非常有必要去学习一下FreeRTOS的任务创建、删除、挂起、恢复和系统启动等,这样才能对FreeRTOS有一个更深入的了解。本章和下一章要讲解的内容和Cortex-M处理器的内核架构联系非常紧密!

qq_28576837的博客 2101

Ardupilot任务调度的理解

Ardupilot通过定时器定时调度一系列任务实现任务调度。 由于Ardupilot固件有基于arduino的APM发展而来,因此程序与arduino的形式类似,包含一个setup()函数与一个loop()函数。这些函数的执行与arduino的执行方式类似,其中setup()只执行一次,loop()函数在setup()函数执行后循环执行。 为了执行任务首先要将任务定义出来。在ArduCopter

guanzhiyuan1994的博客 2292

ucos的任务调度

ucos的任务调度

qq_38636482的博客 2085

FreeRTOS中的任务调度

实时操作系统(RTOS)是为了能在规定的时间内完成特定任务的操作系统。与通用操作系统不同,实时性是其最重要的特征。

blog.boringhex.top 3007

深入理解 XxlJob:分布式任务调度的利器

XxlJob 是一个轻量级分布式任务调度框架,由大众点评员工徐雪里开源。它将任务的调度逻辑与执行逻辑分离,通过统一的调度中心来管理和调度分布在各个节点上的任务。XxlJob 提供了丰富的功能,包括任务的管理、调度、监控、报警等,并且具备良好的扩展性和灵活性,能够适应各种复杂的业务场景。

恩爸编程 1221

Spark整理:spark 任务调度

在生产环境下,Spark 集群的部署方式一般为 YARN-Cluster 模式,之后的内核分析内容 中我们默认集群的部署方式为 YARN-Cluster 模式。 Driver 线程主 要 是 初 始 化 SparkContext 对 象 , 准 备 运 行 所 需 的 上 下 文 , 然 后 一 方 面 保 持 与ApplicationMaster 的 RPC 连接,通过 ApplicationMaster 申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲 Executor 上。当

weixin_38602383的博客 3096
上一篇: java基础之int和Integer的区别
下一篇: 详解SpringBoot整合ace-cache缓存
Keeeevin
博客等级 码龄10年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值