• 1. Quartz的体系结构
  • 2. Quartz的核心API
    • 2.1. Job
    • 2.2. JobDetail
    • 2..3. Trigger
    • 2.3.1. SimpleTrigger简单触发器
    • 2.3.2. CronTrigger表达式触发器(常用)
    • 2.3.3. DailyTimeIntervalTrigger 触发器
    • 2.4. 调度器Scheduler(重)
  • 3. 配置文件

1. Quartz的体系结构


前提、每个定时任务都是一个线程,这些线程都在quartz的线程池中。
第一步、job和trigger必须先要注册在scheduler中。
第二步、scheduler调用注册的trigger。
第三步、trigger被唤醒,调用job,开始执行。
一个job可以被多个Trigger 绑定,但是一个Trigger只能绑定一个job!

API:

  • Scheduler用于与调度程序交互的主程序接口。
    Scheduler调度程序-任务执行计划表,只有安排进执行计划的任务Job(通过Scheduler.scheduleJob),当它预先定义的执行时间到了的时候(任务触发Trigger),该任务才会执行。
  • Job我们预先定义的希望在未来时间能被调度程序执行的任务类,我们可以自定义。
  • JobDetail使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的。
  • JobDataMap可以包含不限量的(序列化的)数据对象,在Job实例执行的时候,可以使用其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便 于存取基本类型的数据的方法。
  • Trigger触发器,Trigger对象是用来触发执行job的。当调度一个job时,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比如每2秒就执行一次。
  • JobBuilder用于声明一个任务实例,也可以定义关于该任务的详情,比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。
  • TriggerBuilder触发器创建器,用于创建触发器trigger实例。
  • JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。

2. Quartz的核心API

2.1. Job

Job即要实现的任务类。
Job类必须实现org.quartz.Job接口,重写execute()方法。

public class HelloJob implements Job{@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {//编写我们自己的业务逻辑(任务)}
}

Job类的命名规则:XxxJob / XxxTask,如:UserJob、BackDBTask。
Job名字要具有唯一性,这里的Job名字不是指Job的类名,而是存在于JobDetail中的任务名。一般情况下采用:JobName + groupName = primary key的组合方式,名字 + 组得到的是主键。如:
生日祝福短信任务:birthday + user = birthdayuser

Job对象在Quartz中的生命周期:
每次调度器执行Job时,它在调用execute()方法前会创建一个新的Job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。(也就是每次执行Job时,都会实例化一个对象,原来的对象被释放)。

2.2. JobDetail

JobDetail用来加载Job的,可以看成是Job的一个清单。
JobDetail为Job实例提供了许多设置属性,以及JobDetaMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。

JobDetail jobDetail = newJob(HelloJob.class).withIdentity("helloJob", "group1").build();

JobDetail重要属性:name、group、jobClass、jobDataMap

// 通过JobBuilder构建JobDetail实例
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)   // 接受一个Job实例.withDescription("Job实例的描述").withIdentity("helloJob", "group1")     // Job名/组名.usingJobData("name", "admin")     // Job实例的属性name=”admin”.build();

其它操作:
jobDetail.getKey().getName(); //获得JobDetail中Job的名称
jobDetail.getKey().getGroup(); //获得JobDetail中Job的组名
jobDetail.getJobClass().getName();

2…3. Trigger

Trigger为执行任务Job的触发器(即触发条件)。
作用:它是来执行工作任务,在什么条件下触发,什么时间执行,多久执行一次。
触发器用来告诉调度程序作业什么时候触发。比如每定时3点发送一份邮件,Trigger将会设置3点进行执行该任务。
框架提供了五种触发器(定时器)类型:

  • SimpleTrigger 简单触发器(或频率触发器)
  • CronTirgger 表达式(定时)触发器(或日历触发器)
  • DateIntervalTrigger
  • NthIncludedDayTrigger
  • Calendar类(org.quartz.Calendar)

最常用的是SimpleTrigger和CronTrigger。

2.3.1. SimpleTrigger简单触发器

作用:执行N次,重复N次。
指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。
它适合的任务类似于:9:00 开始,每隔1小时,执行一次。
属性:

  • repeatInterval 重复间隔
  • repeatCount 重复次数。实际执行次数是 repeatCount+1。因为在startTime的时候一定会执行一次。

----下面有关repeatCount 属性的都是同理。----

SimpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致其不适合调度定时的任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger 的话间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间是随机的(取决于何时执行 misfired 的任务,例如某天的 3:00PM)。这会导致之后每天的执行时间都会变成 3:00PM,而不是我们原来期望的 1:00AM。

2.3.2. CronTrigger表达式触发器(常用)

作用:几时几分几秒,哪天/哪月/哪年,执行,适合于更复杂的任务。

类似于SimpleTrigger,指定从某一个时间开始,以一定的时间间隔执行的任务。 但是不同的是SimpleTrigger指定的时间间隔为毫秒,没办法指定每隔一个月执行一次(每月的时间间隔不是固定值),而CalendarIntervalTrigger支持的间隔单位有秒,分钟,小时,天,月,年,星期

相较于SimpleTrigger有两个优势:
(1)更方便,比如每隔1小时执行,你不用自己去计算1小时等于多少毫秒。
(2)支持不是固定长度的间隔,比如间隔为月和年。但劣势是精度只能到秒。
它适合的任务类似于:9:00 开始执行,并且以后每周 9:00 执行一次

属性:

  • interval 执行间隔
  • intervalUnit 执行间隔的单位(秒,分钟,小时,天,月,星期,年)

类似于 LINUX 上的任务调度命令 crontab,即利用一个包含 7 个字段的表达式来表示时间调度方式。例如,“0 15 10 * * ? *” 表示每天的 10:15AM 执行任务。对于涉及到星期和月份的调度,CronTirgger 是最适合的,甚至某些情况下是唯一选择。例如,“0 10 14 ? 3 WED” 表示三月份的每个星期三的下午 14:10PM 执行任务。

CronExpression表达式(重点、难点):
由左到右按顺序代表: * * * * * * *
格式: [秒] [分] [小时] [日] [月] [周] [年]
七个部分,都可以用*来表示每X。周可以省略不写!




例子:

//每天8:00~17:00,每隔2分钟执行一次
cronSchedule("0 0/2 8-17 * * ?").build();
//每周一,9:30执行一次
cronSchedule("0 30 9 ? * MON").build();
//等同于 0 30 9 ? * MON
weeklyOnDayAndHourAndMinute(MONDAY, 9, 30).build();

2.3.3. DailyTimeIntervalTrigger 触发器

作用:指定每天的某个时间段内,以一定的时间间隔执行任务。并且它可以支持指定星期。
适合的任务类似于:指定每天9:00 至 18:00 ,每隔70秒执行一次,并且只要周一至周五执行。
它的属性有:

  • startTimeOfDay 每天开始时间
  • endTimeOfDay 每天结束时间
  • daysOfWeek 需要执行的星期
  • interval 执行间隔
  • intervalUnit 执行间隔的单位(秒,分钟,小时,天,月,年,星期)
  • repeatCount 重复次数

例子:

dailyTimeIntervalSchedule().startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) //每天9:00开始.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(16, 0)) //16:00 结束 .onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) //周一至周五执行.withIntervalInHours(1) //每间隔1小时执行一次.withRepeatCount(100) //最多重复100次(实际执行100+1次)
.build();dailyTimeIntervalSchedule().startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) //第天9:00开始.endingDailyAfterCount(10) //每天执行10次,这个方法实际上根据 startTimeOfDay+interval*count 算出 endTimeOfDay.onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) //周一至周五执行.withIntervalInHours(1) //每间隔1小时执行一次.build();

2.4. 调度器Scheduler(重)

Scheduler为任务的调度器,它是Quartz的核心,它会将JobDetail及触发器Trigger整合起来,负责基于Trigger设定的时候来执行JobDetail中的Job。

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); //启动
scheduler.shutdown(); //关闭

注1:调度器除了有启动、关闭操作外,还有停止、暂停、继续等操作。

3. 配置文件

Quartz的配置文件是:quartz.properties

//调度标识名 集群中每一个实例都必须使用相同的名称 (区分特定的调度器实例)
org.quartz.scheduler.instanceName:DefaultQuartzScheduler
//ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
org.quartz.scheduler.instanceId :AUTO
//数据保存方式为持久化
org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX
//表的前缀
org.quartz.jobStore.tablePrefix : QRTZ_
//设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题
//org.quartz.jobStore.useProperties : true
//加入集群 true 为集群 false不是集群
org.quartz.jobStore.isClustered : false
//调度实例失效的检查时间间隔
org.quartz.jobStore.clusterCheckinInterval:20000
//容许的最大任务延长时间
org.quartz.jobStore.misfireThreshold :60000
//ThreadPool 实现的类名
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
//线程数量
org.quartz.threadPool.threadCount : 10
//线程优先级
org.quartz.threadPool.threadPriority : 5(threadPriority 属性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量 java.lang.Thread.MIN_PRIORITY,为1)
//自创建父线程
//org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
//数据库别名
org.quartz.jobStore.dataSource : qzDS
//设置数据源
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:123456
org.quartz.dataSource.qzDS.maxConnection:10

Quartz定时任务框架(二)相关推荐

  1. Quartz定时任务框架使用总结

    Quartz可以用来做什么? Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年4月1日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的爱情动作片 ...

  2. Spring集成Quartz定时任务框架介绍

    一.增加所依赖的JAR包 1.增加Spring的Maven依赖 <dependency> <groupId>org.springframework</groupId> ...

  3. 墨客网java_墨客网-知识拆解+经典定时任务案例 精讲Java定时任务框架Elastic-Job和Quartz...

    课程介绍 精讲Elastic-job + Quartz实现企业级定时任务 掌握分布式集群方式的定时任务框架,可以弥补企业中常用的单点任务的缺点,以更高的性能更好的稳定性处理分布式定时任务服务:本课程带 ...

  4. 全云化架构(十一):分布式定时任务框架对比

    分布式定时任务框架对比 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式.叫做分布式定时任务. 常见的分布式定时任务平台有elastic-job , ...

  5. Quartz学习总结(2)——定时任务框架Quartz详解

    一.概述 Quartz是OpenSymphony开源组织的一个开源项目,定时任务框架,纯Java语言实现,最新版本为2.3.0. Quartz中用到的设计模式:Builder模式.Factory模式. ...

  6. 定时任务框架Quartz

    在Spring Boot 中要实现定时任务,有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用Quartz. 1.Scheduled 这种用法非常简 ...

  7. 详细总结:分布式, Nginx Linux Redis 微服务 Dubbo框架 Quartz定时任务

    目录 1.1 概念 2.1分布式概念 2.2分布式项目拆分 2.3分布式项目总结 2.3 分布式事务 3.1 Nginx配置文件介绍 3.2 实现负载均衡(Tomcat高可用) 3.3 常见面试题 4 ...

  8. quartz 每月一次_Quartz 定时任务框架详解

    1.Quartz 体系结构 Quartz 设计有四个核心类,分别是Scheduler(调度器).Job(任务) .Trigger(触发器).JobDetail(任务详情),他们是使用Quartz的关键 ...

  9. 5分钟快速掌握 Python 定时任务框架

    APScheduler 简介 在实际开发中我们经常会碰上一些重复性或周期性的任务,比如像每天定时爬取某个网站的数据.一定周期定时运行代码训练模型等,类似这类的任务通常需要我们手动来进行设定或调度,以便 ...

最新文章

  1. java-静态变量,单例模式
  2. http路径转file会变成反斜杠_PHP session反序列化漏洞
  3. 直播这把“火”,还能烧多久?
  4. SQL的各种连接(cross join、inner join、full join)的用法理解
  5. JSP/Servlet中的汉字编码问题
  6. scala 方法重载_Scala中的方法重载
  7. Linux与Windows共享文件夹之samba的安装与使用 资源管理器直接查看服务器文件
  8. Typescript有什么冷门但是很好用的特性?
  9. Android Studio两模块间getLaunchIntentForPackage跳转,出现intent为null,已解决
  10. 如果理解Javascript利用闭包循环绑定事件
  11. python后台架构Django教程——admin管理员站点
  12. EXTJS源码分析与开发实例-原创2章下载
  13. 【指南 】北理珠第十届C语言程序设计挑战杯
  14. windows上双开微信代码
  15. 台式电脑接路由器步骤_路由器怎么连接台式电脑来上网?
  16. html实现360展示图片,js html5 360度全景图片预览效果
  17. Android错误:unexpected text found in layout file
  18. 企业微信封号规则及解封
  19. SpringMVC @ResponseBody在IE8变下载
  20. OpenVP* 连接失败 查看日志报错:“There are no TAP-Windows adapters on this system ..... “

热门文章

  1. 使用openpyxl读取和写入excell文件
  2. python两个for循环顺序_python两个for循环顺序_Python编程基础2——顺序、循环、选择...
  3. js添加删除数组元素
  4. 7590 xps 拆机_【戴尔XPS13评测】碳纤合金完美结合 精致做工XPS 13拆解_戴尔笔记本电脑_笔记本评测-中关村在线...
  5. 苹果cms怎么推荐视频到网站首页
  6. 电气工程及其自动化(国际合作项目班) C++期末考试
  7. 小组问题解决8D - 为什么需要8D?
  8. 本机文件怎么拉到服务器,本机文件怎么传到云服务器上
  9. 适合计算机系用的笔记本,七款适合设计师的最好的笔记本电脑推荐!
  10. JS字符串替换函数全部替换方法