1.0需要jar包
<!-- 定时器任务 quartz需要导入的坐标 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>
2.0SpringBoot自带定时
@Scheduled 定时规则
@Configuration @EnableScheduling @Component public class ScheduleTest { @Scheduled(fixedRate = 5000) public void scheduleUpdateCronTrigger() throws SchedulerException { System.out.println("5s运行一次,测试用的"); } }
3.1集成Quartz:添加job,写两个类,模拟定时任务
3.1.1:ScheduledJob类
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class ScheduledJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("第一个定时任务" + new Date()); } }
3.1.2:ScheduledJob2类
只需要将ScheduledJob类名改成3.1.1:ScheduledJob2
3.2写一个配置类
实现对于定时任务的启动、暂停、修改、恢复启动。其中两个定时分别为15分钟执行一次和2小时执行一次,如果测试,可以缩短周期import cn.dankal.lc.quartz.job.ScheduledJob; import cn.dankal.lc.quartz.job.ScheduledJob2; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.stereotype.Component; @Component public class MyScheduler { @Autowired SchedulerFactoryBean schedulerFactoryBean; static Scheduler scheduler; public void scheduleJobs() throws SchedulerException { scheduler = schedulerFactoryBean.getScheduler(); startJob1(); // 每15分钟执行一次 startJob2(); // 每两小时执行一次 } public static void startJob1() throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class).withIdentity("job1", "group1").build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/15 * * * ?"); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") .withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); } public static void modifyJob1(String cron) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey("trigger1", "group1"); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); CronTrigger newTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") .withSchedule(scheduleBuilder).build(); scheduler.rescheduleJob(triggerKey, newTrigger); } public static String getJob1Status() throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey("trigger1", "group1"); return scheduler.getTriggerState(triggerKey).name(); } public static void pauseJob1() throws SchedulerException { scheduler.pauseJob(JobKey.jobKey("job1", "group1")); } public static void resumeJob1() throws SchedulerException { scheduler.resumeJob(JobKey.jobKey("job1", "group1")); } private void startJob2() throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(ScheduledJob2.class).withIdentity("job2", "group1").build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0 0/2 * * ?"); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1") .withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, cronTrigger); } public static void modifyJob2(String cron) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey("trigger2", "group1"); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); CronTrigger newTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1") .withSchedule(scheduleBuilder).build(); scheduler.rescheduleJob(triggerKey, newTrigger); } public static String getJob2Status() throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey("trigger2", "group1"); return scheduler.getTriggerState(triggerKey).name(); } public static void pauseJob2() throws SchedulerException { scheduler.pauseJob(JobKey.jobKey("job2", "group1")); } public static void resumeJob2() throws SchedulerException { scheduler.resumeJob(JobKey.jobKey("job2", "group1")); } }
3.3写一个SchedulerListene
import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @Configuration public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> { @Autowired public MyScheduler myScheduler; @Override public void onApplicationEvent(ContextRefreshedEvent event) { try { myScheduler.scheduleJobs(); } catch (SchedulerException e) { e.printStackTrace(); } } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); return schedulerFactoryBean; } }
3.4控制层
import cn.dankal.lc.quartz.config.MyScheduler; import org.quartz.SchedulerException; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class ScheduleController { //务1会修改成1秒钟执行一次 @RequestMapping("/modify") public @ResponseBody String modify() throws SchedulerException { MyScheduler.modifyJob1("0/1 * * * * ?"); return "1"; } //可以查看运行状态 @RequestMapping("/status") public @ResponseBody String status() throws SchedulerException { return MyScheduler.getJob1Status(); } //任务会暂停 @RequestMapping("/pause") public @ResponseBody String pause() throws SchedulerException { MyScheduler.pauseJob1(); return "1"; } //任务会重新运行 @RequestMapping("/resume") public @ResponseBody String resume() throws SchedulerException { MyScheduler.resumeJob1(); return "1"; } }
注:定时任务有固定表达式