SpringBoot整合Quartz定时任务的实现

SpringBoot整合Quartz定时任务的实现

前言

Quartz 设计有三个核心类,分别是 Scheduler(调度器)Job(任务)和 Trigger (触发器)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOwnoLjt-1580725163852)(https://images.pexels.com/photos/3619784/pexels-photo-3619784.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500)]

基础概念

Job
具体需要处理的业务逻辑。

JobDetail
详细的任务描述,包括名称,关联的Job,Job运行时所需要的参数等。

Trigger
任务调度器,描述什么时候执行Job,多久执行一次。

SimpleTrigger 设置重复次数,重复执行间隔时长
CronTrigger 设置Cron表达式
Scheduler
调度容器,Job与Trigger都需要在容器中注册,被容器统一管理。
Cron表达式
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 23 * * ? 每天23点执行一次
0 0 23 ? * * 每天23点执行一次
0 0 23 * * ? * 每天23点执行一次
0 0 23 * * ? 2016 2016年每天23点执行一次
0 0 1 * * ? 每天1点执行一次
0 0 1 1 * ? 每月1号1点执行一次
0 * 14 * * ? 每天14:00点到14:59期间,每隔1分钟执行一次
0 0-5 14 * * ? 每天14:00点到14:05期间,每隔1分钟执行一次
0 0 23 L * ? 每月最后一天23点执行一次
0 0 1 ? * L 每周星期六1点执行一次
0 26,29,33 * * * ? 在26分、29分、33分执行一次
0 0 0,13,18,21 * * ? 每天的0点、13点、18点、21点都执行一次
0 0 0 ? * 6#3 每月第3个星期六

SpringBoot整合Quartz

依赖

 <!--quartz依赖-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

        <!--Scheduler-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

        <!--spring tx 坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>

创建一个定时任务类

所需要的定时任务的Service层放在Job类中,Quartz就会去执行该任务。

public class QuartzJob implements Job {

    @Autowired
    private SysVaccineInfoService sysVaccineInfoService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        /**
         * @title: 疫苗定时任务
         * @description: 疫苗定时任务 server层的vaccineDateQuartz方法
         * @author: X
         * @updateTime: 2019/12/8 1:10
         * @return: void
         * @param: [jobExecutionContext]
         * @throws:
         */
        sysVaccineInfoService.vaccineDateQuartz();
    }
}

Quartz配置类

@Configuration
public class QuartzConfig {

    /**
     * @description: 创建job对象
     * @author: X
     * @updateTime: 2019/12/9 19:47
     */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
        //关联自己的job类
        factory.setJobClass(QuartzJob.class);
        return factory;
    }

    /**
     * @description: 创建Trigger对象
     * @author: X
     * @updateTime: 2019/12/9 19:49
     */
    /*@Bean
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
        //关联JobDetail对象
        factory.setJobDetail(jobDetailFactoryBean.getObject());
        //执行时间(毫秒)
        factory.setRepeatInterval(2000);
        //执行次数
        factory.setRepeatCount(5);
        return factory;
    }*/

    /**
     * @description: 创建Cron Trigger
     * @author: X
     * @updateTime: 2019/12/9 19:48
     */
    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
        CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
        //关联JobDetail对象
        factory.setJobDetail(jobDetailFactoryBean.getObject());
        //执行时间(毫秒)
        factory.setCronExpression("0 0 0 * * ? *");
        return factory;
    }

    /**
     * @description: 创建Scheduler对象
     * @author: X
     * @updateTime: 2019/12/9 19:48
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableJobFactory) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        //关联trigger
        factory.setTriggers(cronTriggerFactoryBean.getObject())
        factory.setJobFactory(myAdaptableJobFactory);
        return factory;
    }
}

factory.setJobFactory(myAdaptableJobFactory);//重写AdaptableJobFactory后面会有介绍原因

运行程序此时需要注意会产生异常(空指针异常),原因是service层没有注入进来

JobDetailFactoryBean实例化job类(QuartzJob.class)时没有将该方法注入到Spring容器中。所以重写AdaptableJobFactory方法将实例化的任务对象手动的添加到SpringIOC容器中并完成对象注入。

@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {

    //AutowireCapableBeanFactory 将对象添加到SpringIOC容器中 并且完成对象注入
    @Autowired
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    /**
     * @title:
     * @description: 该方法需要将实例化的任务对象手动的添加到SpringIOC容器中并完成对象注入
     * @author: X
     * @updateTime: 2019/12/6 21:54
     * @return:
     * @param:
     * @throws:
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object obj = super.createJobInstance(bundle);
        //将obj对象添加到SpringIOC容器中并完成对象注入
        this.autowireCapableBeanFactory.autowireBean(obj);
        return obj;
    }
}

我的博客还有你想知道的其他知识,欢迎浏览。∩__∩y

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot Quartz定时任务是一种在Spring Boot项目中实现定时任务调度的方法。它可以根据设定的时间间隔或者Cron表达式来执行任务。通过引用中提供的源代码和配置文件,可以直接导入Spring Boot项目并配置好数据库即可使用。 为了实现定时任务,需要在项目中创建一个继承自QuartzJobBean的Job类,并重写executeInternal方法。该方法定义了定时任务的具体逻辑,可以在其中执行需要定时执行的业务操作。 另外,还需要创建一个Quartz定时任务的配置类,其中使用@Configuration注解标记为配置类,配置相关的定时任务信息。在该配置类中,可以通过@Bean注解创建JobDetail和Trigger实例,分别定义任务的具体细节和触发器的配置信息。在这个配置类中,我提供了一个示例,用于演示如何配置一个定时任务。 综上所述,Spring Boot Quartz定时任务是一种灵活可靠的定时任务调度方法,可以通过Spring Boot的特性方便地实现任务定时执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springboot+quartz定时任务实现 纯代码](https://download.csdn.net/download/qq_38971617/12284286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot整合Quartz实现定时任务](https://blog.csdn.net/qq_29305715/article/details/123517569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值