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日

相关文章

  • 深入了解Java.Util.Date详情

    深入了解 Java.Util.Date 详情 在 Java 中,Java.Util.Date 类表示日期和时间对象。尽管它被广泛使用,但它也有一些限制和缺点。本文将详细介绍 Java.Util.Date,涵盖其构建方法、常用方法、格式化等内容,帮助你更深入地了解和使用。 构建 Java.Util.Date 对象 我们可以使用以下构建方法来创建 Java.Ut…

    Java 2023年5月20日
    00
  • 关于Struts2的类型转换详解

    关于Struts2的类型转换详解 什么是类型转换 在Struts2中,类型转换是将HTTP请求中的字符串类型的参数转换为Java对象的过程。例如,将”1″转换为整数类型的1,将”2021-01-01″转换为日期类型的2021/01/01。类型转换是Struts2框架中非常重要的一部分,可以帮助开发者轻松地获取HTTP请求中的参数并将其转换为Java对象。St…

    Java 2023年5月20日
    00
  • 修改Tomcat运行时jvm编码问题

    下面是修改Tomcat运行时jvm编码问题的完整攻略: 1. 了解Tomcat jvm编码问题 Tomcat是一个开源的Web应用服务器,使用Java语言编写,可以运行Java Web应用程序。在使用Tomcat时,我们有时会遇到在Tomcat运行时出现乱码的问题,这是由于Tomcat运行时jvm编码设置不正确所导致的。 jvm是Java Virtual M…

    Java 2023年5月20日
    00
  • 浅谈Java对象禁止使用基本类型

    浅谈Java对象禁止使用基本类型 什么是基本类型 基本类型是Java中的8种基本数据类型,包括boolean、byte、short、int、long、float、double和char。这些类型并不是对象,是Java中的原始类型。 为什么Java对象禁止使用基本类型 虽然基本类型在Java中的使用非常方便和高效,但是基本类型缺乏封装性,难以进行面向对象的编程…

    Java 2023年5月26日
    00
  • Java线程池详细解读

    Java线程池详细解读 什么是线程池? 线程池是一种用于多线程管理的机制,它可以有效管理将要执行的任务,减轻了创建和销毁线程的负担。通过复用现有线程,避免了大量线程创建和销毁过程中的开销,从而提高了应用程序的性能和可伸缩性。 线程池的优势 线程池的优势主要体现在以下几个方面: 更好的利用 CPU 资源和减少上下文切换的时间开销。 可以根据需要创建和回收线程,…

    Java 2023年5月26日
    00
  • Java实战之实现一个好用的MybatisPlus代码生成器

    首先需要明确的是,MybatisPlus是Mybatis的一个增强版本,能够大大提高开发效率。而MybatisPlus代码生成器能够自动生成基本的CRUD操作,这对于快速搭建项目是非常有帮助的。下面我将详细讲解如何实现一个好用的MybatisPlus代码生成器。 准备工作 添加MybatisPlus及其依赖到项目中。 创建数据库及数据表。(以下示例中,我们使…

    Java 2023年5月19日
    00
  • JavaWeb BeanUtils信息类原理详解

    JavaWeb BeanUtils信息类原理详解 什么是JavaWeb BeanUtils信息类? JavaWeb BeanUtils信息类是JavaWeb项目中用于操作Java Bean的一个工具类库。它通过反射机制,提供了一组Java代码操作Bean的接口。相较于手动编写大量的getter/setter方法,BeanUtils使用起来更加简便和高效。 B…

    Java 2023年5月26日
    00
  • Java中Jackson快速入门

    Java中Jackson快速入门 1. 什么是Jackson? Jackson是Java中最常用的处理JSON数据的库之一,它可以将JSON字符串转换为Java对象,或将Java对象转换为JSON字符串。 2. Jackson的使用方法 2.1 添加依赖 在Maven项目中,我们可以通过以下方式添加Jackson的依赖: <dependency>…

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