项目中用的quartz执行定时任务,但是执行的Job里,@Autowired为null。原因是quartz自己管理的Job对象,没有被SpringBoot管理,解决办法就是托管给Spring Boot管理。
没经过多方查找资料,找的了一个简单的解决方法。如下
添加Pom依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
ScheduleAutoBeanFactory
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component
public class ScheduleAutoBeanFactory extends AdaptableJobFactory implements ApplicationContextAware {
private transient AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
//Using SpringBeanJobFactory to create job
final Object job = super.createJobInstance(bundle);
//Using context to get AutowireCapableBeanFactory and using beanFactory to autowire job instance
beanFactory.autowireBean(job);
return job;
}
}
ScheduleJobConfig
import lombok.extern.slf4j.Slf4j;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.util.Properties;
@Configuration
@Slf4j
public class ScheduleJobConfig {
@Autowired
private ScheduleAutoBeanFactory factory;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(factory);
try {
StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(createSchedulerProperties());
schedulerFactoryBean.setSchedulerFactory(schedulerFactory);
}catch (Exception e){
log.error("ScheduleJobConfig setSchedulerFactory error--->{}",e.getMessage());
}
return schedulerFactoryBean;
}
@Bean
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
private Properties createSchedulerProperties() {
Properties properties = new Properties();
properties.put("org.quartz.scheduler.instanceName", "TestScheduler");
properties.put("org.quartz.scheduler.instanceId", "AUTO");
properties.put("org.quartz.scheduler.skipUpdateCheck", "true");
properties.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
properties.put("org.quartz.threadPool.threadCount", "12");
properties.put("org.quartz.threadPool.threadPriority", "5");
properties.put("org.quartz.jobStore.misfireThreshold", "10000");
return properties;
}
}
定义执行的job
@Component
public class InstanceGenerator implements Job {
// 这个地方 @Autowired为空
@Autowired
InstanceServciceClient instanceServciceClient;
@Autowired
InstanceManager instanceManager;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//业务代码
}
}
ProjectManager 添加trigger并执行的类
@Slf4j
@Component
@EnableScheduling
public class ProjectManager {
@Autowired
private Scheduler scheduler;
public void addTrigger(ProjectTf projectTf) {
JobDataMap newJobDataMap = new JobDataMap();
newJobDataMap.put(String.valueOf(projectTf.getId()), projectTf);
//1、创建 JobDetail
JobDetail jobDetail = JobBuilder.newJob(InstanceGenerator.class)
.usingJobData(newJobDataMap).build();
//2、创建CronTrigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.startNow() //立即生效
.withSchedule(CronScheduleBuilder.cronSchedule(projectTf.getCronString())) // 设置cron表达式
.build();
try {
// 设置jobDetail, cronTrigger
scheduler.scheduleJob(jobDetail, cronTrigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
// 开始执行
public void start() {
try {
if (!scheduler.isStarted())
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public void stop() {
try {
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
网友评论