如何使用
1.导入quartz相关依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2.Job类默认是使用AdaptableJobFactory类的createJobInstance通过newInstance()反射进行实例化的,需要手动将job对象添加到SpringIOC容器中并且完成对象的注入。 编写一个类MyAdaptableJobFactory继承AdaptableJobFactory,覆盖createJobInstance()方法。
MyAdaptableJobFactory类
package com.example.task.config;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component
public class MyAdaptableJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
//该方法将job对象手动的添加到SpringIOC容器中并且完成对象的注入
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
this.autowireCapableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
3.定义SchedulerConfig配置类
package com.example.task.config;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.io.IOException;
import java.util.Properties;
@Configuration
public class SchedulerConfig {
@Autowired
private MyAdaptableJobFactory myAdaptableJobFactory;
/**
* 创建Scheduler
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
factoryBean.setJobFactory(myAdaptableJobFactory); //调用JobFactory把对象注入到SpringIOC容器中
return factoryBean;
}
@Bean(name = "scheduler")
public Scheduler scheduler() throws IOException{
return this.schedulerFactoryBean().getScheduler();
}
}
4.定义一个job类,实现Job接口
package com.example.task.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class Job1 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Execute..." + new Date());
}
}
5.写一个测试类
package com.example.task.controller;
import com.example.task.job.Job1;
import com.example.task.service.TaskService;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TaskController {
@Autowired
@Qualifier("scheduler")
private Scheduler scheduler;
@GetMapping("/test")
public void startJob() throws SchedulerException {
this.scheduler.start();
final JobDetail jobDetail = JobBuilder.newJob(Job1.class).withIdentity("job1", "group1").build();
final CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("* * * * * ?");
final CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(scheduleBuilder).build();
this.scheduler.scheduleJob(jobDetail, trigger);
}
}
6.当然,有另一种更简单实现定时任务的方式:使用@EnableScheduling和@Scheduled注解。项目启动后就会执行。
@EnableScheduling开启定时任务调度
@Scheduled声明要定时执行的任务
package com.example.task.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@Configuration
@EnableScheduling
public class EnableSchduling {
//每秒都执行。。。。。。
@Scheduled(cron = "* * * * * ?")
public void test01() {
System.out.println("每秒都执行。。。。。。");
}
//初始延迟3秒执行,之后每隔10秒执行
@Scheduled(fixedRateString = "10000", initialDelay = 3000)
public void test02() {
System.out.println("初始延迟3秒执行,之后每隔10秒执行");
}
// 每隔5秒执行一次
@Scheduled(fixedDelayString = "5000")
public void test03() {
System.out.println("每隔5秒执行一次");
}
}