SpringBoot任务调度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot任务调度相关的知识,希望对你有一定的参考价值。

参考技术A SpringBoot提供了任务调度功能,可以指定启动服务器立刻执行某些任务逻辑,或指定时间调用某些任务逻辑。

SpringBoot提供了 ApplicationRunner 和 CommandLineRunner 接口,实现任何一个即可。

1. ApplicationRunner

2. CommandLineRunner

总结:多个任务可以使用@Order定义调度顺序,从1,2,3,4...;多个任务采用单线程同步模式执行。

如果需要多个任务需要异步执行调用,可以使用 @EnableAsync 和 @Async 标记。

提示:在需要的时机注入MyTask3任务对象,调用run1、run2方法。

在以前经常使用 Quartz 工具来实现任务调度。后期Spring框架引入 Schedule 任务模块,实现了任务调度功能。( Spring+Quartz 、 Spring Schedule )

1. Spring Schedule模块应用

cron表达式( 由7部分构成,格式为“秒 分  时  日  月  星期  年” )

2. Spring Quartz整合应用

编写任务组件

配置JobDetail、CronTrigger、ScheduleFactoryBean组件

springboot集成quartz实现任务调度

quartz

概述
  • 特点
    • 强大的调度功能
    • 灵活的应用方式
    • 分布式和集群能力
  • 用到的设计模式
    • Builder 模式
    • factory模式
    • 组件模式
    • 链式写法
  • 体系结构
    • 调度器
    • 任务
    • 触发器
  • 架构图
    • 技术分享图片

      spring boot quartz
  • pom配置
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
  • 编写job类
package com.ltf.shop.quartzdemo;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("hello word quartz");
    }
}
  • 编写quartz定义类
package com.ltf.shop.quartzconfig;

import com.ltf.shop.quartzdemo.HelloJob;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfig {
    /**
     * 创建Job对象
     */
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean()
    {
        JobDetailFactoryBean factory=new JobDetailFactoryBean();
        factory.setJobClass(HelloJob.class);
        return  factory;
    }

    /**
     * 创建Job对象
     */
//    @Bean
//    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean)
//    {
//        SimpleTriggerFactoryBean simpleTriggerFactoryBean=new SimpleTriggerFactoryBean();
//        //关联JobDetail对象
//        simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
//        //设置执行的毫秒数
//        simpleTriggerFactoryBean.setRepeatInterval(3000);
//        simpleTriggerFactoryBean.setRepeatCount(15);
//        return simpleTriggerFactoryBean;
//    }

//    /**
//     * 创建scheduler对象
//     */
//    @Bean
//    public SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean)
//    {
//        SchedulerFactoryBean schedulerFactoryBean=new SchedulerFactoryBean();
//        schedulerFactoryBean.setTriggers(simpleTriggerFactoryBean.getObject());
//        return schedulerFactoryBean;
//    }


    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean)
    {
        CronTriggerFactoryBean cronTriggerFactoryBean=new CronTriggerFactoryBean();
        cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
        cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
        return cronTriggerFactoryBean;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean)
    {
        SchedulerFactoryBean schedulerFactoryBean=new SchedulerFactoryBean();
        schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
        return schedulerFactoryBean;
    }
}

以上是关于SpringBoot任务调度的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构中的任务调度:在 SpringBoot 框架中使用异步任务,定时任务和邮件任务

springboot集成quartz实现任务调度

SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?

SpringBoot技术专题「开发实战系列」动态化Quartz任务调度机制+实时推送任务数据到前端

JavaSpringboot-Quartz-分布式任务调度

SpringBoot技术专题「开发实战系列」动态化Quartz任务调度机制+实时推送任务数据到前