项目背景:
最近项目上遇到个需求,需要我们在特定的事件做邮件和短信的发送。但时间并不固定,是根据用户配置的时间表来进行的定时发送任务。有点像闹钟,你设置的时间到了就响。这里我们采取的是每天凌晨定时取数据库里的时间表信息,把今天该执行的定时任务配置成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 {@Overridepublic 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秒打印一次 后面重新执行后十秒打印一次