项目背景:
最近项目上遇到个需求,需要我们在特定的事件做邮件和短信的发送。但时间并不固定,是根据用户配置的时间表来进行的定时发送任务。有点像闹钟,你设置的时间到了就响。这里我们采取的是每天凌晨定时取数据库里的时间表信息,把今天该执行的定时任务配置成quartz,到时间了就自动执行
1.添加依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2.创建执行任务的任务类
package com.example.demo.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestJob01 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("任务打印"+sdf.format(new Date()));
}
}
3.创建调用任务的调度类
package com.example.demo.job;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TestJob01Scheduler {
private static JobDetail jobDetail = JobBuilder.newJob(TestJob01.class).withIdentity("testJob01", "group11").build();
private static Scheduler scheduler;
static {
try {
scheduler = new StdSchedulerFactory().getScheduler();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
// 执行任务
public static void run(String cron) throws SchedulerException{
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group21")
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.build();
//将任务及其触发器放入调度器
scheduler.scheduleJob(jobDetail, trigger);
//调度器开始调度任务
// 启动
if (!scheduler.isShutdown()) {
scheduler.start();
}
}
public static void main(String[] args) throws SchedulerException {
TestJob01Scheduler testJob01Scheduler = new TestJob01Scheduler();
//5秒执行一次
testJob01Scheduler.run("*/5 * * * * ?");
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//清理完scheduler里面的任务
scheduler.clear();
//10秒执行一次
testJob01Scheduler.run("*/10 * * * * ?");
}
}
4.执行效果
可以看到,前两个打印任务是5秒打印一次 后面重新执行后十秒打印一次