美文网首页
SpringBoot 集成 quartz @Autowired

SpringBoot 集成 quartz @Autowired

作者: 小玉1991 | 来源:发表于2021-07-08 19:16 被阅读0次

项目中用的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();
        }
    }

}

相关文章

网友评论

      本文标题:SpringBoot 集成 quartz @Autowired

      本文链接:https://www.haomeiwen.com/subject/prbtpltx.html