# SpringBoot定时任务——Quartz定时任务框架

SpringBoot定时任务——Quartz定时任务框架


Quartz的介绍及使用思路

概念

Quartz是JobScheduling领域开源项目,可以创建运行10个或者百个Jobs。
在这里插入图片描述

使用思路
  • Job:任务(做什么)
  • Trigger:触发器(什么时候做)
  • Scheduler:任务调度(什么时候要去做什么事)

SpringBoot整合

加入依赖
  • pom.xml
<!--  添加Quartz的依赖      -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</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>
编写Quartz的配置类
@Configuration
public class QuartzConfig {
    /**
     * 1.创建Job对象
     */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        //关联自己的Job类
        jobDetailFactoryBean.setJobClass(QuartzDemo.class);
        return jobDetailFactoryBean;
    }

    /**
     * 2.创建Tigger对象:简单的Trigger
     */
    //    @Bean
    //    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
    //        SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
    //        //关联JobDetail对象
    //        simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
    //        //设置方法触发时间
    //        simpleTriggerFactoryBean.setRepeatInterval(2000);
    //        //设置重复次数
    //        simpleTriggerFactoryBean.setRepeatCount(3);
    //        return simpleTriggerFactoryBean;
    //    }

    /**
     * Cron Trigger
     */
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
        //关联JobDetail对象
        cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        //设置触发时间
        cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
        return cronTriggerFactoryBean;
    }

    /**
     * 3.创建Scheduler对象
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean simpleTriggerFactoryBean) {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //关联Trigger
        schedulerFactoryBean.setTriggers(simpleTriggerFactoryBean.getObject());
        return schedulerFactoryBean;
    }
}
启动类
@SpringBootApplication
@EnableScheduling
public class TaskCenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskCenterApplication.class);
    }
}

在这里插入图片描述

Job类中注入对象

注入时候产生异常

在这里插入图片描述

解决方法:手动将对象添加到SpringIoc中

编写一个类,手动将对象注入到SpringIoc容器中

  • QuartzToSpringIoc.java
@Component("quartzToSpringIoc")
public class QuartzToSpringIoc extends AdaptableJobFactory {

    //AutowireCapableBeanFactory:可以将对象添加到SpringIoc的容器中,并且完成该对象的属性注入
    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    /**
     * 该方法需要将实例化的任务对象手动的添加到Springioc的容器中
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object object = super.createJobInstance(bundle);
        //将obj对象添加到SpringIoc容器中完成注入
        autowireCapableBeanFactory.autowireBean(object);
        return object;
    }
}
修改Quartz的配置类

在这里插入图片描述

/**
 * 3.创建Scheduler对象
 */
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean simpleTriggerFactoryBean, QuartzToSpringIoc quartzToSpringIoc) {
    SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
    //关联Trigger
    schedulerFactoryBean.setTriggers(simpleTriggerFactoryBean.getObject());
    //将我们的配置类
    schedulerFactoryBean.setJobFactory(quartzToSpringIoc);
    return schedulerFactoryBean;
}

问题解决
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37248504/article/details/106874496