在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入。
Spring有自己的Schedule定时任务,在Spring boot中使用的时候,不能动态管理JOB,于是就使用Quartz来实现。
在Spring Boot中配置Quartz:
import java.io.IOException;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration@EnableSchedulingpublic class QuartzSchedule {
@Autowired private MyJobFactory myJobFactory;
@Bean public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setOverwriteExistingJobs(true);
// 延时启动 factory.setStartupDelay(20);
// 加载quartz数据源配置 factory.setQuartzProperties(quartzProperties());
// 自定义Job Factory,用于Spring注入 factory.setJobFactory(myJobFactory);
return factory;
}
/** * 加载quartz数据源配置 * * @return * @throws IOException */ @Bean public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
}
为了在JOB中使用Spring管理的Bean,需要重新定义一个Job Factory:
@Componentpublic class MyJobFactory extends AdaptableJobFactory {
@Autowired private AutowireCapableBeanFactory capableBeanFactory;
@Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
// 调用父类的方法 Object jobInstance = super.createJobInstance(bundle);
// 进行注入 capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
然后在JOB中就可以使用Spring管理的Bean了
public class MyJob implements Job, Serializable {
private static final long serialVersionUID = 1L;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired private SomeService someService;
@Override public void execute(JobExecutionContext context) throws JobExecutionException {
someService.doSomething();
}
}
下面代码是创建JOB:
JobDetail jobDetail = JobBuilder.newJob(((Job) Class.forName(job.getClazz()).newInstance()).getClass()) .withIdentity(job.getJobName(), job.getJobGroup()).build();
jobDetail.getJobDataMap().put("extdata", job.getExtData());
// 表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()) .withMisfireHandlingInstructionDoNothing();
// 构建一个trigger TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerKey) .withSchedule(scheduleBuilder);
if (job.getStartTime() != null) {
triggerBuilder.startAt(job.getStartTime());
}
if (job.getEndTime() != null) {
triggerBuilder.endAt(job.getEndTime());
}
CronTrigger trigger = triggerBuilder.build();
scheduler.scheduleJob(jobDetail, trigger);
// 注入到管理类
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法
- springboot整合Quartz实现动态配置定时任务的方法
- springboot整合quartz实现定时任务示例
- spring boot整合quartz实现多个定时任务的方法
- springboot+Quartz实现任务调度的示例代码
- spring boot + quartz集群搭建的完整步骤