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
- @EnableScheduling
- public 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:
- @Component
- public 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;
- }
- }<span style="font-size:14px;">
- </span>
- 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();
- }
- }