大家好,欢迎来到IT知识分享网。
1 任务调度
1.1 什么时候需要任务调度?
1.1.1 任务调度的背景
1.2 任务调度需求分析
任务调度的实现方式有很多,如果要实现我们的调度需求,我们对这个工具有什么样的基本要求呢?
1.2.1 基本需求
1.3 任务调度工具对比
| 层次 | 举例 | 特点 |
|---|---|---|
| 操作系统 | Linux crontab Windows 计划任务 | 只能执行简单脚本或者命令 |
| 数据库 | MySql,Oracle | 可以操作数据,不能执行Java代码 |
| 工具 | Kettle | 可以操作数据,执行脚本,没有集中配置 |
| 开发语言 | JDK Timer,ScheduleThreadPool | Timer:单线程,JDK1.5之后,ScheduleThreadPool(Cache,Fiexed,Single)没有集中配置,日程管理不够灵活 |
| 容器 | Spring Task,@Scheduled | 不支持集群 |
| 分布式框架 | XXL-JOB,Elatic-Job |
2 Quartz 基本介绍
3 Quartz Java 编程
3.1 引入依赖
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
3.2 默认配置文件
org.quartz.core 包下,有一个默认的配置文件,quartz.properties。当我们没有定义一个同名的配置文件的时候,就会使用默认配置文件里面的配置。
org.quartz.scheduler.instanceName: DefaultQuartzScheduler org.quartz.scheduler.rmi.export: false org.quartz.scheduler.rmi.proxy: false org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 10 org.quartz.threadPool.threadPriority: 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
3.3 创建 Job
实现唯一的方法 execute(),方法中的代码就是任务执行的内容。此处仅输出字符串。
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("假发在哪里买的"); } }
JobDetail jobDetail = JobBuilder.newJob(MyJob1.class) .withIdentity("job1", "group1") .usingJobData("gupao","2673") .usingJobData("moon",5.21F) .build();
3.4 创建 Trigger
在测试类 main()方法中,基于 SimpleTrigger 定义了一个每 2 秒钟运行一次、不断重复的 Trigger:
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2) .repeatForever()) .build();
3.5 创建 Scheduler
SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start();
注意这里,调度器一定是单例的。
3.6 体系结构总结
3.6.1 JobDetail
我们创建一个实现 Job 接口的类,使用 JobBuilder 包装成 JobDetail,它可以携带KV 的数据。
3.6.2 Trigger
| Calendar名称 | 用法 |
|---|---|
| BaseCalendar | 为高级的 Calendar 实现了基本的功能,实现了 org.quartz.Calendar 接口 |
| AnnualCalendar | 排除年中一天或多天 |
| CronCalendar | 日历的这种实现排除了由给定的 CronExpression 表达的时间集合。 例如,您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时间(上午 8 点至下午 5 点)。 如果 CronTrigger 具有给定的 cron 表达式并且与具有相同表达式的 CronCalendar 相关联,则日历将排除触发器包含的所有时间,并且它们将彼此抵消。 |
| DailyCalendar | 您可以使用此日历来排除营业时间(上午 8 点 – 5 点)每天。 每个DailyCalendar 仅允许指定单个时间范围,并且该时间范围可能不会跨越每日边界(即,您不能指定从上午 8 点至凌晨 5 点的时间范围)。 如果属性 invertTimeRange 为 false(默认),则时间范围定义触发器不允许触发的时间范围。 如果 invertTimeRange 为 true,则时间范围被反转 – 也就是排除在定义的时间范围之外的所有时间。 |
| HolidayCalendar | 特别的用于从 Trigger 中排除节假日 |
| MonthlyCalendar | 排除月份中的指定数天,例如,可用于排除每月的最后一天 |
| WeeklyCalendar | 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日 |
3.6.3 Scheduler
3.6.4 Listener
| 方法 | 作用或执行实际 |
|---|---|
| getName() | 返回 JobListener 的名称 |
| jobToBeExecuted() | Scheduler 在 JobDetail 将要被执行时调用这个方法 |
| jobExecutionVetoed() | Scheduler 在 JobDetail 即将被执行,但又被 TriggerListener 否决了时调用这个 |
| 方法 | |
| jobWasExecuted() | Scheduler 在 JobDetail 被执行之后调用这个方法 |
TriggerListener
| 方法 | 作用或执行实际 |
|---|---|
| getName() | 返回监听器的名称 |
| jtriggerFired() | Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个 |
| 方法 | |
| vetoJobExecution() | 在 Trigger 触 发 后 , Job 将 要 被 执 行 时 由 Scheduler 调 用 这 个 方 法 。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行 |
| triggerMisfired() | Trigger 错过触发时调用 |
| triggerComplete() | Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法 |
3.6.5 JobStore
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 使用 quartz.properties,不使用默认配置 org.quartz.jobStore.useProperties:true #数据库中 quartz 表的表名前缀 org.quartz.jobStore.tablePrefix:QRTZ_ org.quartz.jobStore.dataSource:myDS #配置数据源 org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/gupao?useUnicode=true&characterEncoding=utf8 org.quartz.dataSource.myDS.user:root org.quartz.dataSource.myDS.password: org.quartz.dataSource.myDS.validationQuery=select
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112002.html

