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日

相关文章

  • 详解微信小程序开发用户授权登陆

    详解微信小程序开发用户授权登陆 微信小程序开发用户授权登陆是小程序中常见的功能之一,允许用户授权登录并获取用户信息。本攻略将详细介绍如何实现微信小程序用户授权登录,并提供示例代码供参考。 1. 开发者配置 在微信公众平台中注册小程序,并在开发者工具中创建小程序项目。在小程序管理后台中,开启“用户信息”权限,同时设置授权回调页面路径。 2. 获取用户权限 在小…

    Java 2023年5月30日
    00
  • Springboot 2.x集成kafka 2.2.0的示例代码

    下面我就来详细讲解一下“Springboot 2.x集成kafka 2.2.0的示例代码”的完整攻略。 简介 Kafka 是一个高吞吐量的分布式消息队列系统,常被用于日志处理、消息系统等场景。Spring Boot 是目前流行的 Java Web 开发框架,具有简单、快速、方便等特点。本文将介绍如何在 Spring Boot 2.x 中集成 Kafka 2.…

    Java 2023年6月2日
    00
  • 老生常谈Java反射机制(必看篇)

    老生常谈Java反射机制(必看篇) 什么是Java反射机制? Java反射机制是Java提供的一种能够在运行时获取对象的信息以及修改对象的内容的方法。通过反射机制,程序可以获取任意一个类的内部信息,并且可以操作类、构造器、方法、成员变量等。 反射机制的应用场景 通过配置文件来读取实例化的对象 对框架类进行扩展 调试时查看对象的属性信息 反射机制的基本用法 获…

    Java 2023年5月26日
    00
  • java中的常见关键字解析

    Java中的关键字是具有特殊含义的词汇,它们在编写Java程序时起着非常重要的作用。在本文中,我们将详细讲解Java中的常见关键字及其用法。 标识符 Java中的标识符是用来命名变量、方法和类等的名称,标识符需要满足以下要求: 标识符是由字母、数字、下划线组成的序列。 第一个字符必须是字母或下划线。 标识符不能是Java关键字。 标识符区分大小写。 示例: …

    Java 2023年5月26日
    00
  • 详细聊聊Spring MVC重定向与转发

    详细聊聊Spring MVC重定向与转发 在Spring MVC中,重定向和转发是两种常见的请求转发方式。本文将详细介绍Spring MVC中重定向和转发的概念、区别、使用方法以及示例。 重定向 重定向是指将请求重定向到另一个URL。在Spring MVC中,我们可以使用RedirectView或RedirectAttributes类来实现重定向。下面是实现…

    Java 2023年5月17日
    00
  • 浅谈request.getinputstream只能读取一次的问题

    当使用request.getInputStream()方法获取请求数据流时,数据流只能被读取一次,如果多次读取,将无法获取数据。这是一个常见的问题,对于此问题的解决,我们可以使用如下两种方法: 方法一:使用Filter过滤器 通过过滤器来代替直接获取输入流,将获取到的输入流存放在自定义的HttpServletRequestWrapper中并使用缓存将数据流缓…

    Java 2023年6月15日
    00
  • 详解Java的位操作符

    详解Java的位操作符 在Java编程中,位操作符是十分重要的操作符之一。它可以对数字进行位运算,通过改变二进制数的位来实现一些比较复杂的操作。本文将详细讲解Java的位操作符。 按位与(&)操作符 按位与操作符”&”主要用于对二进制数进行与运算。如果两个位都是1,那么结果就是1,否则结果就是0。下面是一个示例: int a = 6; int…

    Java 2023年5月26日
    00
  • 详解Java中运算符及用法

    详解Java中运算符及用法 Java中运算符可以分为算术运算符、关系运算符、逻辑运算符、位运算符、三目运算符等类型。下面逐一介绍这些类型的运算符及其用法。 算术运算符 Java中的算术运算符包括加减乘除、取余等。 加减乘除运算符 运算符 描述 示例 + 加号:相加运算符 5+2=7 – 减号:相减运算符 5-2=3 * 乘号:相乘运算符 5*2=10 / 除…

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