Quartz - Trigger触发器的介绍
Posted Tang.Mr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz - Trigger触发器的介绍相关的知识,希望对你有一定的参考价值。
注意:
本文应用了Quartz入门中的入门案例作为基础
1.Trigger触发器的介绍
上图即是Quartz的触发器类型,常用的为SimpleTriggerImpl,CronTriggerImpl
1.SimpleTriggerImpl的使用
设置触发的开始时间和结束时间及执行计划
/**
* @Author ScholarTang
* @Date 2021/7/13 10:45
* @Desc 任务类
*/
@Slf4j
@PersistJobDataAfterExecution
public class HelloJobTrigger implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Trigger trigger = jobExecutionContext.getTrigger();
JobKey jobKey = trigger.getJobKey();
log.info("触发器名称:" + jobKey.getName() + " | 触发器组名:" + jobKey.getGroup() );
log.info("触发器开始执行时间:" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(trigger.getStartTime()) + " | 触发器结束执行时间:" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(trigger.getEndTime()));
log.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " | 任务被执行了");
}
}
/**
* @Author ScholarTang
* @Date 2021/7/13 10:53
* @Desc 调度器
*/
@Slf4j
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//开始时间 & 结束时间
Date startTime = new Date();
Date endTime = new Date();
endTime.setTime(endTime.getTime() + 20000);
//从调度工厂中获取调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//通过JobBuilder构建一个任务实例
JobDetail jobDetail = JobBuilder.newJob(HelloJobTrigger.class)
//设置任务的唯一实例名称和任务组名称组名
.withIdentity("job1", "group1")
//构建实例
.build();
//通过TriggerBuilder构建触发器实例
SimpleTrigger trigger = TriggerBuilder.newTrigger()
//设置触发器唯一实例名称和触发器的组名
.withIdentity("trigger1", "group1")
//执行计划,每五秒执行一次
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)
.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY) //重复执行次数
)
//开始执行时间
.startAt(startTime)
//结束执行时间
.endAt(endTime)
//构建实例
.build();
//调度器绑定任务实例和触发器
scheduler.scheduleJob(jobDetail,trigger);
//开启定时任务
scheduler.start();
}
}
注意:
- SimpleTrigger的属性有:开始时间,结束时间,重复次数和重复时间间隔
- 重复次数的值可以为0、正数、或常量。例如:SimpleTrigger.REPEAT_INDEFINITELY
- 重复的时间间隔属性值必须为大于0或者长整型的整数,以毫秒为为时间单位,当重复的时间间隔为0时,意味着与Trigger同时触发执行
- 如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于;当我们需要创建一个每间隔10秒触发一次直到指定的结束时间的Trigger,而无需去计算从开始到结束的所重复执行次数。我们只需要简单的执行结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性值即可
2.CronTrigger触发器的介绍
2.1.CronTrigger简介
如果需要像日历那样按日程来触发任务,而不是像SimpleTrigger那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用,因为它是基于日历的任务调度器
使用CronTrigger,可以指定诸如每个周五的12点,或者每天的9点等等…这样的日程来安排触发。甚至还可以像SimpleTrigger一样,CornTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定任何日期不再继续
2.2.corn表达式
corn表达式相信大家并不陌生,corn表达式被用来配置CronTrigger实例。corn表达式是一个由7个表达式组成的字符串。每一个子表达式描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:seconds秒、minutes分钟、hours小时、day-of-month月中的天、moth月,year年
2.3.表达式的取值
在线生成corn表达式:https://cron.qqe2.com/
2.3.演示案例
/**
* @Author ScholarTang
* @Date 2021/7/13 16:28
* @Desc 任务类
*/
@Slf4j
public class HelloJonCornTrigger implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " | 任务被执行了");
}
}
/**
* @Author ScholarTang
* @Date 2021/7/13 10:53
* @Desc 调度器
*/
@Slf4j
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//从调度工厂中获取调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//通过JobBuilder构建一个任务实例
JobDetail jobDetail = JobBuilder.newJob(HelloJonCornTrigger.class)
//设置任务的唯一实例名称和任务组名称组名
.withIdentity("job1", "group1")
//构建实例
.build();
//通过TriggerBuilder构建触发器实例
Trigger trigger = TriggerBuilder.newTrigger()
//设置触发器唯一实例名称和触发器的组名
.withIdentity("trigger1", "group1")
//立刻执行
.startNow()
//每年的每月的每个星期得每天的每小时的每秒都会执行
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
//构建实例
.build();
//调度器绑定任务实例和触发器
scheduler.scheduleJob(jobDetail,trigger);
//开启定时任务
scheduler.start();
}
}
以上是关于Quartz - Trigger触发器的介绍的主要内容,如果未能解决你的问题,请参考以下文章