目录
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
1) 可以定义触发的规则,比如基于时刻,时间间隔,表达式
2) 可以定义需要执行的任务。比如一个脚本或者一段代码。。。任务和规则是分开的
3) 集中管理配置爱,持久配置。
? 不把规则写在代码里面,可以看到所有的任务配置。方便维护
? 重启之后任务可以再次调度---配置在文件或者配置中心
4) 支持任务的串行执行
5) 支持多个任务并发执行,互不干扰
6)有自己的调度器,可以启动、中断、停止任务
7)容易集成到spring
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
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
public class MyTask1 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("第一次测试quartz定时任务,当前时间: "+ TimeUtil.getCurrentTime());
}
}
JobDetail jobDetail = JobBuilder.newJob(MyTask1.class)
//name group 构成唯一id
.withIdentity("job1","group1")
.usingJobData("abc","first value")
.build();
//创建trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
//2秒执行一次
.withIntervalInSeconds(2)
//不停止
.repeatForever())
.build();
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
实现类 | 描述 | 特点 |
---|---|---|
CalendarIntervalTriggerImpl | 基于日历的 | |
CronTriggerImpl | 基于cron表达式 | |
DailyTimeIntervalTriggerImpl | 基于日期的 | 每天的某个时段 |
SimpleTriggerImpl | 简单触发器 | 固定时刻 |
SimpleTrigger 可以定义固定时刻或者固定时间间隔的调度规则(精确到毫秒)。
例如:每天 9 点钟运行;每隔 30 分钟运行一次。
CalendarIntervalTrigger 可以定义更多时间单位的调度需求,精确到秒。
好处是不需要去计算时间间隔,比如 1 个小时等于多少毫秒。
例如每年、每个月、每周、每天、每小时、每分钟、每秒。
每年的月数和每个月的天数不是固定的,这种情况也适用
每天的某个时间段内,以一定的时间间隔执行任务。
例如:每天早上 9 点到晚上 9 点,每隔半个小时执行一次,并且只在周一到周六执 行。
CronTirgger 可以定义基于 Cron 表达式的调度规则,是最常用的触发器类型
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
scheduler.start();
AnnualCalendar holidays = new AnnualCalendar();
// 排除中秋节
Calendar midAutumn = new GregorianCalendar(2019, 9, 13);
holidays.setDayExcluded(midAutumn, true);
// 排除圣诞节
Calendar christmas = new GregorianCalendar(2019, 12, 25);
holidays.setDayExcluded(christmas, true);
// 调度器添加日历
scheduler.addCalendar("holidays", holidays, false, false);
JobDetail jobDetail = JobBuilder.newJob(MyTask1.class)
.withIdentity("job1", "group1")
.usingJobData("gupao","青山 2673")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.modifiedByCalendar("holidays")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2)
.repeatForever())
.build();
Date firstRunTime = scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + " 第一次触发: " + firstRunTime);
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 | 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日 |
Scheduler 中的方法主要分为三大类:
1)操作调度器本身,例如调度器的启动 start()、调度器的关闭 shutdown()。
2)操作 Trigger,例如 pauseTriggers()、resumeTrigger()。
3)操作 Job,例如 scheduleJob()、unscheduleJob()、rescheduleJob()
检测任务的生命周期
观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则 所有依赖它的对象都会得到通知并自动更新。
Quartz 中提供了三种 Listener,监听 Scheduler 的,监听 Trigger 的,监听 Job 的。
Jobstore 用来存储任务和触发器相关的信息,例如所有任务的名称、数量、状态等 等。Quartz 中有两种存储任务的方式,一种在在内存,一种是在数据库。
把任务和触发器信息运行的信息 存储在内存中,用到了 HashMap、TreeSet、HashSet 等等数据结构。 如果程序崩溃或重启,所有存储在内存中的数据都会丢失。所以我们需要把这些数 据持久化到磁盘。
JDBC 的实现方式有两种,JobStoreSupport 类的两个子类:
JobStoreTX:在独立的程序中使用,自己管理事务,不参与外部事务。
JobStoreCMT:(Container Managed Transactions (CMT),如果需要容器管理事 务时,使用它。
使用 JDBCJobSotre 时,需要配置数据库信息:
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:123456
org.quartz.dataSource.myDS.validationQuery=select 0 from dual
原文:https://www.cnblogs.com/dylan-thomas/p/12191781.html