1. 加入依赖
<!-- quartz坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- Scheduled坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- spring tx坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
2. 实现Job类
此时@Autowired注入的为null,解决该问题见第4部分
@Component
public class TableToReleaseJob extends QuartzJobBean {
@Autowired
private RestTemplate restTemplate;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 需要执行的定时任务
}
}
3. 写配置类
@Configuration
public class QuartzConfig {
@Autowired
private MyAdaptableJobFactory myAdaptableJobFactory;
@Bean
public Scheduler scheduler(){
return schedulerFactoryBean().getScheduler();
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setTaskExecutor(schedulerThreadPool());
// 先关联triggers
factory.setJobFactory(myAdaptableJobFactory);
return factory;
}
@Bean
public Executor schedulerThreadPool(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors());
executor.setQueueCapacity(Runtime.getRuntime().availableProcessors());
return executor;
}
// 或者如下方式配置
// 1.Job对象
// @Bean
// public JobDetailFactoryBean jobDetailFactoryBean(){
// JobDetailFactoryBean factory = new JobDetailFactoryBean();
// // 关联自己的job类
// factory.setJobClass(TableToReleaseJob.class);
// return factory;
// }
// 2.Trigger对象 (简单的Trigger)
// @Bean
// public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
// SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
// // 关联jobDetail对象
// factory.setJobDetail(jobDetailFactoryBean.getObject());
// // 设置触发时间 该参数表示执行的毫秒数
// factory.setRepeatInterval(2000);
// // 设置重复次数
// factory.setRepeatCount(5);
// return factory;
// }
// 2.Cron Trigger对象
// @Bean
// public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
// CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
// factory.setJobDetail(jobDetailFactoryBean.getObject());
// // 设置触发时间
// factory.setCronExpression("0/10 42 22 24 12 ? 2021");
//
// return factory;
// }
// 3.Scheduler对象
// @Bean
// public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory){
// SchedulerFactoryBean factory = new SchedulerFactoryBean();
//
// // 先关联triggers
// factory.setTriggers(cronTriggerFactoryBean.getObject());
// factory.setJobFactory(myAdaptableJobFactory);
//
// return factory;
// }
}
4. 解决Job的中注入为空的问题
// 使用定时器,解决注入为空的问题
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {
// AutowireCapableBeanFactory 可以将一个对象添加到SpringIOC容器中,并完成该对象的注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
// 该方法需要将实例化的任务对象手动添加到springIOC容器中完成对象注入
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj = super.createJobInstance(bundle);
// 将obj添加到SpringIOC容器中,完成对象注入
this.autowireCapableBeanFactory.autowireBean(obj);
return obj;
}
}
5. 使用定时任务
try{
//触发器
Trigger trigger = TriggerBuilder.newTrigger()
.startNow()//立即生效
.withSchedule(CronScheduleBuilder.cronSchedule("0 43 11 27 12 ? 2021"))
.build();
// 任务Job
JobDetail jobDetail = JobBuilder.newJob(TableToReleaseJob.class)
.usingJobData("tableId",tableId)
.build();
// 开始Job
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}catch (SchedulerException e){
e.printStackTrace();
}