SpringBoot集成quartz实现定时任务详解

SpringBoot集成Quartz实现定时任务详解

1. 什么是Quartz

Quartz是一个开源的作业调度框架,其主要用于定时调度任务。它能够完成复杂的调度需求,如在指定时间执行任务、每天执行任务、周末执行任务等。

2. SpringBoot集成Quartz

2.1 引入依赖

我们首先需要在pom.xml文件中引入quartz和spring-boot-starter-quartz依赖。

<!-- quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

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

2.2 编写定时任务类

我们需要自定义一个定时任务类,这个类需要实现org.quartz.Job接口,同时需要重写execute方法。

例如,我们自定义一个定时任务类MyTask,代码如下:

public class MyTask implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行定时任务:" + new Date());
    }
}

2.3 配置任务触发器

在使用Quartz实现定时任务时,我们通常需要配置任务触发器,才能实现定时执行任务的效果。

我们可以在配置文件中配置一个默认的触发器,也可以在代码中自定义触发器。

例如,我们在代码中自定义一个触发器,执行一次任务后间隔5秒钟再继续执行下一次任务:

@Bean
public JobDetail myTaskDetails() {
    return JobBuilder.newJob(MyTask.class).withIdentity("myTask").storeDurably().build();
}

@Bean
public Trigger myTaskTrigger() {
    SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInSeconds(5)
            .repeatForever();
    return TriggerBuilder.newTrigger().forJob(myTaskDetails())
            .withIdentity("myTaskTrigger")
            .withSchedule(scheduleBuilder)
            .build();
}

2.4 启动调度器

最后,我们需要在SpringBoot启动类中添加一个启动Quartz调度器的方法。

例如:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public SchedulerFactoryBean quartzScheduler() {
        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
        factoryBean.setJobDetails(myTaskDetails());
        factoryBean.setTriggers(myTaskTrigger());
        return factoryBean;
    }
}

3. 示例

下面我们来演示两个使用SpringBoot集成Quartz实现定时任务的例子。

3.1 示例1:每分钟执行一次任务

我们定义一个MyTask类,每次执行任务后让线程休眠10秒钟。

public class MyTask implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行定时任务:" + new Date());
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

我们将每分钟执行一次任务,并让任务在执行前先延迟5秒钟。

@Bean
public JobDetail myTaskDetails() {
    return JobBuilder.newJob(MyTask.class).withIdentity("myTask").storeDurably().build();
}

@Bean
public Trigger myTaskTrigger() {
    SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInMinutes(1)
            .repeatForever()
            .withMisfireHandlingInstructionNextWithRemainingCount();
    return TriggerBuilder.newTrigger().forJob(myTaskDetails())
            .withIdentity("myTaskTrigger")
            .startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.SECOND))
            .withSchedule(scheduleBuilder)
            .build();
}

3.2 示例2:每天凌晨执行一次任务

我们定义一个MyTask类,每次执行任务后打印当前日期。

public class MyTask implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行定时任务:" + new Date());
    }
}

我们将每天凌晨执行一次任务,并让任务在执行前先延迟10秒钟。

@Bean
public JobDetail myTaskDetails() {
    return JobBuilder.newJob(MyTask.class).withIdentity("myTask").storeDurably().build();
}

@Bean
public Trigger myTaskTrigger() {
    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0 0 * * ?");
    return TriggerBuilder.newTrigger().forJob(myTaskDetails())
            .withIdentity("myTaskTrigger")
            .startAt(DateBuilder.futureDate(10, DateBuilder.IntervalUnit.SECOND))
            .withSchedule(scheduleBuilder)
            .build();
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot集成quartz实现定时任务详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Sprint Boot @Async使用方法详解

    Spring Boot的@Async注解 在Spring Boot中,@Async注解用于标记异步方法。使用@Async注解可以将方法标记为异步方法,并在调用这些方法时使用线程池来执行它们。本文将详细介绍@Async注解的作用和使用方法,并提供两个示例说明。 @Async注解作用 在Spring Boot中,@Async注解的作用是标记方法为异步方法。使用@…

    Java 2023年5月5日
    00
  • Java Stream API 使代码更出色的操作完全攻略

    Java Stream API 使代码更出色的操作完全攻略 Java Stream API 是一个用于处理集合的 API,它允许以声明性方式处理数据。使用流,我们可以过滤、转换、聚合和排序数据,而无需编写大量的循环和条件语句。本文将教你如何使用 Java Stream API 让你的代码更加简洁和易于理解。 创建流 使用 Java Stream API,我们…

    Java 2023年5月23日
    00
  • Java 对象序列化 NIO NIO2详细介绍及解析

    Java 对象序列化 NIO NIO2详细介绍及解析 本文将从以下三个方面详细介绍Java中的对象序列化、NIO和NIO2: Java对象序列化 NIO NIO2 Java对象序列化 Java对象序列化是指将Java对象转换为字节流,以便在网络上传输或在本地保存到文件中。 Java中的对象序列化可以通过序列化(Serialization)API来实现,包括S…

    Java 2023年5月27日
    00
  • java实现斐波那契数列的3种方法

    以下是详细讲解“Java实现斐波那契数列的3种方法”的完整攻略。 一、斐波那契数列简介 斐波那契数列(Fibonacci Sequence)是一个非常经典的数学问题,它的定义如下: 斐波那契数列是一列数字,第一和第二项为 1,之后的每一项都是前两项之和。 数列的前几项为:1,1,2,3,5,8,13,21,34,55,89,144,… … 二、Java实现斐…

    Java 2023年5月19日
    00
  • Java多线程之定时器Timer的实现

    对于Java多线程之定时器Timer的实现,我们可以分为以下几个步骤: 1. 导入Timer类 在Java中,我们需要通过import java.util.Timer来导入Timer类的使用。 2. 创建Timer实例对象 在导入Timer类之后,我们需要通过Timer timer = new Timer()来创建一个Timer实例对象。 3. 创建Time…

    Java 2023年5月19日
    00
  • MyBatis Generator ORM层面的代码自动生成器(推荐)

    MyBatis Generator是一个ORM层面的代码自动生成器,它可以根据数据库表结构自动生成Java代码的ORM映射文件、实体类以及Mapper接口,从而大大提高开发效率。 下面是使用MyBatis Generator生成ORM代码的完整攻略: 准备工作 首先,我们需要安装JDK和MySQL数据库,并在MySQL中创建好要生成ORM代码的数据库表。 接…

    Java 2023年5月20日
    00
  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    Sure,我来介绍一下Spring Data JPA实现持久化存储数据到数据库的攻略。 Spring Data JPA实现持久化存储数据到数据库的攻略 简介 Spring Data JPA(Java Persistence API)是Spring Data的一部分,它简化了对JPA的使用和集成。它提供了通用的JPA Repository接口,可以轻松地在Sp…

    Java 2023年6月2日
    00
  • java字符串遍历以及统计字符串中各类字符

    让我来详细讲解一下 Java 字符串遍历以及统计字符串中各类字符的攻略。 什么是字符串 在 Java 中,字符串是一个由零个或多个字符组成的对象。Java 中的字符串类型是 String,可以用来表示文本内容。字符串可用于存储、比较、格式化和输出文本等各种用途。 字符串的遍历 字符串的遍历是指按照顺序依次访问字符串中的每一个字符。Java 中字符串的遍历通常…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部