SpringBoot定时任务的实现详解

 更新时间:2024年01月08日 10:07:23   作者:探索er  
这篇文章主要介绍了SpringBoot定时任务的实现详解,定时任务是企业级开发中最常见的功能之一,如定时统计订单数、数据库备份、定时发送短信和邮件、定时统计博客访客等,简单的定时任务可以直接通过Spring中的@Scheduled注解来实现,需要的朋友可以参考下

前言

定时任务是企业级开发中最常见的功能之一,如定时统计订单数、数据库备份、定时发送短信和邮件、定时统计博客访客等。

简单的定时任务可以直接通过Spring中的@Scheduled注解来实现,复杂的定时任务则可以通过集成Quartz来实现,下面分别予以介绍。

1. @Scheduled

@Scheduled是由Spring提供的定时任务注解,使用方便,配置简单,可以解决工作中大部分的定时任务需求,使用方式如下:

1.1 创建工程

首先创建一个普通的Spring Boot Web工程,添加Web依赖即可,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

1.2 开启定时任务

在项目启动类上添加@EnableScheduling注解开启定时任务,代码如下:

@SpringBootApplication
@EnableScheduling
public class TestforeverApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestforeverApplication.class, args);
    }
}

1.3 配置定时任务

定时任务主要通过@Scheduled注解进行配置,代码如下:

@Component
public class MySchedule {
    // 当前任务执行结束1秒后开启另一个任务
    @Scheduled(fixedDelay = 1000)
    public void fixedDelay() {
        System.out.println("fixedDelay:"+new Date());
    }
    // 当前任务开始执行2秒后开启另一个定时任务
    @Scheduled(fixedRate = 2000)
    public void fixedRate() {
        System.out.println("fixedRate:"+new Date());
    }
    // 当前任务开始执行2秒后开启另一个定时任务,并且首次延迟1秒执行
    @Scheduled(initialDelay = 1000, fixedRate = 2000)
    public void initialDelay() {
        System.out.println("initialDelay:"+new Date());
    }
    // 使用crom 表达式,下面表示定时任务每分钟执行一次
    @Scheduled(cron = "0 * * * * ?")
    public void cron() {
        System.out.println("cron:"+new Date());
    }
}

代码解释:

  • 通过@Scheduled注解来标注一个定时任务,其中fixedDelay= 1000表示在当前任务执行结束1秒后开启另一个任务,fixedRate= 2000表示在当前任务开始执行2秒后开启另一个定时任务,initialDelay= 1000则表示首次执行的延迟时间。
  • 在@Scheduled注解中也可以使用cron表达式,cron="0 * * * * ?"表示该定时任务每分钟执行一次

配置完成后,接下来启动Spring Boot项目即可,定时任务部分打印日志如图所示。

在这里插入图片描述

2. Quartz

2.1 Quartz简介

Quartz是一个功能丰富的开源作业调度库,它由Java写成,可以集成在任何Java应用程序中,包括Java SE和Java EE等。使用Quartz可以创建简单或者复杂的执行计划,它支持数据库、集群、插件以及邮件,并且支持cron表达式,具有极高的灵活性。Spring Boot中集成Quartz和Spring 中集成Quartz比较类似,主要提供三个Bean: JobDetail、 Trigger 以及SchedulerFactory。

2.2 整合Spring Boot

首先创建Spring Boot项目,添加Quartz依赖,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2.3 创建Job

接着我们使用不同的方式创建两个 Job。

2.3.1 Bean方式

Job 可以是一个普通的 JavaBean。如果是普通的 JavaBean,那么可以先添加 @Component 注解将之注册到 Spring 容器中。

@Component
public class MyFirstJob {
    public void sayHello() {
        System.out.println("MyFirstJob:sayHello:" + new Date());
    }
}

2.3.2 抽象类 QuartzJobBean

Job 也可以继承抽象类 QuartzJobBean。若继承自 QuartzJobBean,则要实现该类中的 executeInternal 方法,该方法在任务被调用时使用。

public class MySecondJob extends QuartzJobBean {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected void executeInternal(JobExecutionContext context) {
        System.out.println("hello:" + name + ":" + new Date());
    }
}

2.4 提供 Quartz 相关配置 Bean

接下来创建 QuartzConfig 对 JobDetail 和 Trigger 进行配置,并创建 SchedulerFactory。

JobDetail 的配置有两种方式:

  • 第一种方式通过 MethodInvokingJobDetailFactoryBean 类配置 JobDetail,只需要指定 Job 的实例名和要调用的方法即可,注册这用方式无法在创建 JobDetail 时传递参数。
  • 第二种方式通过 JobDetailFactoryBean 来实现,这种方式只需要指定 JobClass 即可,然后可以通过 JobDataMap 传递参数到 Job 中,Job 中只需要提供属性名,并且提供一个相应的 set 方法即可接收到参数。

Trigger 有多种不同的实现,这里展示两种常用的 Trigger:SimpleTrigger 和 CronTrigger。

  • SimpleTrigger 使用 SimpleTriggerFactoryBean 进行创建。在 SimpleTriggerFactoryBean 对象中,首先设置 JobDetail,接着配置任务循环次数、任务启动延迟时间、任务的时间间隔。
  • CronTrigger 使用 CronTriggerFactoryBean 进行创建。在 SimpleTriggerFactoryBean 对象中,则主要配置 JobDetail 和 Cron 表达式。
@Configuration
public class QuartzConfig {
    /********** 配置两个 JobDetail **********/
    // 通过 MethodInvokingJobDetailFactoryBean 类配置 JobDetail
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail1() {
        MethodInvokingJobDetailFactoryBean bean =
                new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }
    // 通过 JobDetailFactoryBean 来实现 JobDetail
    @Bean
    JobDetailFactoryBean jobDetail2() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MySecondJob.class);
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","sang");
        bean.setJobDataMap(jobDataMap);
        bean.setDurability(true);
        return bean;
    }
    /********** 创建两个 Trigger **********/
    // 创建一个 SimpleTrigger
    @Bean
    SimpleTriggerFactoryBean simpleTrigger() {
        SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail1().getObject()); // 设置 jobDetail
        bean.setRepeatCount(3); // 任务循环次数为3(总共会执行4次)
        bean.setStartDelay(2000); // 任务启动延迟2秒执行
        bean.setRepeatInterval(2000);  // 任务的时间间隔为2秒
        return bean;
    }
    // 创建一个 CronTrigger
    @Bean
    CronTriggerFactoryBean cronTrigger() {
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetail2().getObject()); // 设置 jobDetail
        bean.setCronExpression("* * * * * ?"); // 设置 Cron 表达式
        return bean;
    }
    /********** 创建 SchedulerFactory **********/
    @Bean
    SchedulerFactoryBean schedulerFactory() {
        // 通过 SchedulerFactoryBean 创建 SchedulerFactor
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 配置两个 Trigger
        SimpleTrigger simpleTrigger = simpleTrigger().getObject();
        CronTrigger cronTrigger = cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
}

经过这几步的配置,定时任务就配置成功了。接下来启动Spring Boot项目,控制台打印日志如图所示。

在这里插入图片描述

可以看到 MyFirstJob 在重复 3 次之后便不再执行(一共执行 4 次),而 MySecondJob 则每秒执行 1 次,一直执行下去。

到此这篇关于SpringBoot定时任务的实现详解的文章就介绍到这了,更多相关SpringBoot定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java中的Lambda表达式

    详解Java中的Lambda表达式

    这篇文章主要介绍了Java中的Lambda表达式的的相关资料,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 基于Java 利用Mybatis实现oracle批量插入及分页查询

    基于Java 利用Mybatis实现oracle批量插入及分页查询

    这篇文章主要介绍了基于Java 利用Mybatis实现oracle批量插入及分页查询,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-07-07
  • java实现单链表倒转的方法

    java实现单链表倒转的方法

    这篇文章主要为大家详细介绍了java实现单链表倒转的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 浅谈Java编程之if-else的优化技巧总结

    浅谈Java编程之if-else的优化技巧总结

    说实话,其实我很讨厌在代码里大量使用if-else,一是因为该类代码执行方式属于面向过程的,二嘛,则是会显得代码过于冗余.这篇笔记,主要记录一些自己在工作实践当中针对if-else的优化心得,将会不定期地长期更新,需要的朋友可以参考下
    2021-06-06
  • JAVA代码块你了解吗

    JAVA代码块你了解吗

    这篇文章主要介绍了举例说明Java中的代码块,包括静态属性和非静态属性以及构造函数等相关的执行先后,需要的朋友可以参考下
    2021-09-09
  • Java中浅拷贝与深拷贝实例解析

    Java中浅拷贝与深拷贝实例解析

    这篇文章主要给大家介绍了关于Java中浅拷贝与深拷贝的相关资料,拷贝对象是java中经常会遇到的问题,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • java中gradle项目报错org.gradle .api.plugins.MavenPlugin解决办法

    java中gradle项目报错org.gradle .api.plugins.MavenPlugin解决办法

    在使用Gradle时开发者可能会遇到org.gradle .api.plugins.MavenPlugin报错提醒,这篇文章主要给大家介绍了关于java中gradle项目报错org.gradle .api.plugins.MavenPlugin的解决办法,需要的朋友可以参考下
    2023-12-12
  • JAVA多线程抢红包的实现示例

    JAVA多线程抢红包的实现示例

    这篇文章主要介绍了JAVA多线程抢红包的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Mybatis动态SQL foreach批量操作方法

    Mybatis动态SQL foreach批量操作方法

    这篇文章主要介绍了Mybatis动态SQL foreach批量操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 如何解决redis的NOAUTH Authentication required异常

    如何解决redis的NOAUTH Authentication required异常

    这篇文章主要介绍了Jedis异常解决:NOAUTH Authentication required,,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-07-07

最新评论