quartz是一个可以动态的建立定时任务的。我们可以动态的添加、修改、删除任务。
Quartz 核心概念
- Job: 表示一个工作,要执行的具体内容。此接口中只有一个方法,如下:
void execute(JobExecutionContext context)
- JobDetail: 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
- Trigger: 代表一个调度参数的配置,什么时候去调。
- Scheduler: 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
在这篇文章中,我先不介绍那么多原理(其实是自己也没看懂)。我们先用起来。
第一步
pom依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
第二步
建一个类,该类实现了 org.quartz.Job 类。并实现了方法:
public interface Job {
/**
*实现类需要实现该方法
*/
void execute(JobExecutionContext context)
throws JobExecutionException;
}
在实现类的 execute(JobExecutionContext context) 我们可以获取到参数,并实现自己需要实现的业务逻辑。
public class QuartzJobTest implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("QuartzJobTest--"+ new Date() +"---实现业务逻辑");
}
}
第三步
建立定时任务并把第二步建立的类做为业务逻辑让任务每次启动时执行。
在添加任务之前我们需要先实例化一个Scheduler
public class QuartzJobUtil {
//使用默认的配置
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
public static void addJob(String jobName, String jobGroupName, int time, Class <? extends Job> jobClass) {
//创建任务
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
//创建触发器 每 time 秒钟执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName, jobGroupName)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(time).repeatForever())
.build();
try {
//获取实例化的 Scheduler。
Scheduler scheduler = getScheduler();
//将任务及其触发器放入调度器
scheduler.scheduleJob(jobDetail, trigger);
//调度器开始调度任务
if (!scheduler.isShutdown()) {
scheduler.start();
System.out.println(String.format("启动任务,jobName:%s ,jobGroupName:%s",jobName ,jobGroupName));
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//获取一个默认的Scheduler对象
private static Scheduler getScheduler() {
try {
return schedulerFactory.getScheduler();
} catch (SchedulerException e) {
e.printStackTrace();
}
return null;
}
}
public void deleteJob(String jobName, String jobGroupName){
try {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
Scheduler scheduler = getScheduler();
scheduler.pauseTrigger(triggerKey);// 停止触发器
scheduler.unscheduleJob(triggerKey);// 移除触发器
scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
System.out.println(String.format("删除任务,jobName:%s ,jobGroupName:%s",jobName ,jobGroupName));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
以上是对quartz的定时任务的简单实现,后面的文章,再详细的了解其他的方法和配置等。
参考资料:
https://www.w3cschool.cn/quartz_doc/
https://github.com/quartz-scheduler/quartz-scheduler.org-site/issues