1.准备工作
建立Maven工程
2.引入Quartz的jar包
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
3.入门案例
创建HelloJob任务类
// 定义任务类
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
LocalDateTime now = LocalDateTime.now();
// 定义工作任务内容
System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
}
}
创建任务调度类HelloSchedulerDemo
HelloSchedulerDemo.java
public class HelloSchedulerDemo {
public static void main(String[] args) throws Exception {
// 1:从工厂中获取任务调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.build();
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.startNow() // 马上执行
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.repeatSecondlyForever(5)) // 每5秒执行一次
.build();
// 4:使用触发器调度任务的执行
scheduler.scheduleJob(job, trigger);
// 5:开启
scheduler.start();
// 关闭
// scheduler.shutdown();
}
}
4.Job和JobDetail介绍
-
Job:工作任务调度的接口,任务类需要实现该接口。在里面编写任务执行的业务逻辑。
-
Job实例在Quartz中的生命周期:每次调度器执行Job时,它在调用execute方法前会创建一个新的Job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。
-
JobDetail:JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。
-
JobDetail重要属性:name、group、jobClass、jobDataMap
JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("job1", "group1") // 定义该实例唯一标识,并指定一个组。 .build(); System.out.println("name:"+job.getKey().getName()); System.out.println("group:"+job.getKey().getGroup()); System.out.println("jobClass:"+job.getJobClass().getName());
5.JobExecutionContext介绍
- 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;
- Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。
6.Trigger介绍
Quartz有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和CronTrigger。
(1)jobKey
表示job实例的标识,触发器被触发时,该指定的job实例会被执行。
(2)startTime
表示触发器的时间表,第一次开始被触发的时间,它的数据类型是java.util.Date。
(3)endTime
指定触发器终止被触发的时间,它的数据类型是java.util.Date。
7.SimpleTrigger触发器
SimpleTrigger对于设置和使用是最为简单的一种 QuartzTrigger。
它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行 n 次的 Job 所设计的。
案例一:表示在一个指定的时间段内,执行一次作业任务;
HelloJobSimpleTrigger.java
// 定义任务类
public class HelloJobSimpleTrigger implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
LocalDateTime now = LocalDateTime.now();
// 定义工作任务内容
System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
}
}
HelloSchedulerDemoSimpleTrigger.java
public class HelloSchedulerDemoSimpleTrigger {
public static void main(String[] args) throws Exception {
// 1:从工厂中获取任务调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义日期
Date startDate = new Date();
// 启动任务,任务在当前时间3秒后执行
startDate.setTime(startDate.getTime()+3000);
// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJobSimpleTrigger.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.build();
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.startAt(startDate)
.build();
// 4:使用触发器调度任务的执行
scheduler.scheduleJob(job, trigger);
// 5:开启
scheduler.start();
// 关闭
// scheduler.shutdown();
}
}
案例二:或在指定的时间间隔内多次执行作业任务。
修改HelloSchedulerDemoSimpleTrigger.java
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)
.withRepeatCount(2)) // 每5秒执行一次,连续执行3次后停止,默认值是0
.build();
案例三:指定任务的结束时间。
修改HelloSchedulerDemoSimpleTrigger.java
// 定义日期
Date endDate = new Date();
// 启动结束,任务在当前时间10秒后停止
endDate.setTime(endDate.getTime()+10000);
// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJobSimpleTrigger.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.build();
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.startAt(startDate)
.endAt(endDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)
.withRepeatCount(3)) // 每5秒执行一次,连续执行3次后停止
.build();
需要注意的点
- SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔。
- 重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY。
- 重复的时间间隔属性值必须为大于0或长整型的正整数,以毫秒作为时间单位,当重复的时间间隔为0时,意味着与Trigger同时触发执行。
- 如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的 Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性 值即可。
8.CronTrigger触发器
如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用,因为它是基于日历的作业调度器。
使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。
(1)Cron Expressions——Cron 表达式
Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:
- Seconds 秒
- Minutes 分钟
- Hours 小时
- Day-of-Month 月中的天
- Month 月
- Day-of-Week 周中的天
- Year (optional field) 年(可选的域)
对于Cron表达式书写规范,我们通过以下两个表格来学习
序号 | 单位 | 是否必填 | 允许添加的值 | 允许使用的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0~59 | , - * / |
2 | 分 | 是 | 0~59 | , - * / |
3 | 时 | 是 | 0~23 | , - * / |
4 | 日 | 是 | 1~31 | , - * / ? L W |
5 | 月 | 是 | 1~12 或者 JAN~DEC | , - * / |
6 | 周 | 是 | 1~7 或者 SUN~SAT | , - * / ? L # |
7 | 年 | 否 | empty 或者 1970~2099 | , - * / |
通配符 | 说明 | 案例 |
---|---|---|
, | 是一个分隔符 | 秒位置上 20,40 。表示在第20秒和第40秒时触发任务 |
- | 是一个分区(区间) | 秒位置上 5-10。表示在第5、6、7、8、9、10秒都会触发任务 |
* | 表示任何值 | 分位置上*。表示在每一个分钟都会触发任务 |
/ | 表示递增 | 秒位置上5/10。表示在5、15、25、35、45、55秒时触发任务 |
? | 表示不确定值 | 因为我们在定日期时,一般确定了几日就没办法确定是周几,反之亦然 |
L | 表示最后 | 日位置上写L。表示每月最后一天 周位置上写L。表示最后一周。 通常会和1~7配合使用。在周位置上写4L,表示本月最后一周的周三 |
W | 表示最近的工作日(单纯指定周一到周五) | 在日位置上写10W。表示如果10日是工作日就在10日执行。如果10日是周六,那么就9日执行。如果10日是周日,就11日执行 |
# | 表示第几个 | 周位置上写6#3。表示每月第三个周五执行。如果#后面写的数字大了,是一个不存在的日期,就忽略不执行 |
618零时触发任务的表达式:0 0 0 18 6 ?
cron表达式生成器:http://cron.ciding.cc/
案例:
HelloJobCronTrigger.java
// 定义任务类
public class HelloJobCronTrigger implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
LocalDateTime now = LocalDateTime.now();
// 定义工作任务内容
System.out.println("进行数据库备份操作。当前任务执行的时间:"+now);
}
}
HelloSchedulerDemoCronTrigger.java
public class HelloSchedulerDemoCronTrigger {
public static void main(String[] args) throws Exception {
// 1:从工厂中获取任务调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJobCronTrigger.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.build();
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * 6 4 ?"))// 定义表达式
.build();
// 4:使用触发器调度任务的执行
scheduler.scheduleJob(job, trigger);
// 5:开启
scheduler.start();
// 关闭
// scheduler.shutdown();
}
}
上一篇文章:Quartz的了解-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/143355511下一篇文章: