【SpringBoot】9 定时任务(Quartz)

news2024/9/22 17:24:36

介绍

实现方式

java定时任务调度的实现方式:Timer,ScheduledExecutor,Spring Scheduler,JCron Tab,Quartz 等。

Quartz

Quartz是一个由Java开发的开源项目,它可以与J2EE、J2SE应用程序相结合也可以单独使用。
Quartz是一个定时调度框架,用来执行定时任务(某个时间出发执行某个动作)。

官网

https://www.quartz-scheduler.org/

核心概念

Scheduler:调度器,负责进行任务的调度与管理。Scheduler可以启动、停止、暂停、恢复任务的执行,还可以配置任务的触发条件和执行计划。
Trigger:触发器,负责定义任务的触发条件,即何时触发任务执行。一个Job可以关联一个或多个Trigger,根据时间表达式或特定的时间间隔来配置触发器。
TriggerBuilder:触发器构建器,用来创建触发器的实例。
Job:业务组件,需要被调度任务执行的具体事件。需要将Job注册到Scheduler中,调度器会调用Job接口的execute方法完成具体的业务实现。
JobDetail:任务详情,JobDetail是与Job相关联的详细信息,包括Job名称、所属的Job类、Job的身份标识等。
JobBuilder:任务构建器,用来创建JobDetail实例。
JobStore:任务存储,Quartz的持久化机制,负责将任务和调度相关的信息存储到数据库或其他存储介质中。即使应用程序重启或服务器关闭,已经配置的调度任务仍然可以保留。
Listener:监听器,Quartz提供了丰富的监听器接口,可以监控任务的状态变化、执行情况、异常事件。通过实现监听器接口,可以在任务执行前后、暂停、恢复、出错等情况下执行额外的逻辑。
ThreadPool:线程池,Scheduler使用线程池来并发执行任务,提高任务的处理效率。允许配置线程池的大小、类型、特性,以适应不同的负载情况。
在这里插入图片描述

三大核心组件

Scheduler(调度器)、Trigger(触发器)、Job(任务)

持久化方式

Quartz提供了两种持久化方式
1)RAMJobStore:在默认情况下,Quartz会将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能。不足之处是缺乏数据的持久性,当程序停止或崩溃时,所有运行的信息都会丢失。
2)JobStoreTX:分布式方式一般采用此中方式,持久化到数据库中。所有的任务信息都会保存到数据库中,可以控制事务,如果应用程序或服务器关闭或重启时,已经保存到数据库中的任务信息不会丢失,并且可以恢复继续执行。

依赖

pom.xml

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

<!-- 读取yml配置文件 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

方式1(简单)

效果图

在这里插入图片描述

代码实现

ScheduleConfig.java

package com.lm.system.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author DUHAOLIN
 * @date 2024/8/12
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "schedule")
public class ScheduleConfig {

    private String cron;

    private int day;

}

application.yml

schedule:
  cron:  0/5 * * * * ?  #5s执行一次

Task.java

package com.lm.system.job;

import lombok.extern.slf4j.Slf4j;

import java.util.Random;

/**
 * 具体的任务类
 * @author DUHAOLIN
 * @date 2024/8/12
 */
@Slf4j
public class Task {

    public void execute(int arg) {
        int i = new Random().nextInt(arg);
        log.info("执行具体任务,{}", i);
    }

}

TaskSchedule.java

package com.lm.system.job;

import com.lm.system.config.ScheduleConfig;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.annotation.Resource;

/**
 * @author DUHAOLIN
 * @date 2024/8/12
 */
@Slf4j
@Configuration
public class TaskSchedule {

    @Resource
    private ScheduleConfig scheduleConfig;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(Trigger taskTrigger) {
        log.info("注册调度器");
        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
        factoryBean.setTriggers(taskTrigger); //注册触发器
        return factoryBean;
    }

    @Bean
    public CronTriggerFactoryBean taskTrigger(JobDetail taskJob) {
        log.info("注册触发器");
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        bean.setJobDetail(taskJob);
        bean.setCronExpression(scheduleConfig.getCron());
        return bean;
    }

    @Bean
    public MethodInvokingJobDetailFactoryBean taskJob() {
        log.info("注册任务");
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        bean.setConcurrent(false); //同一Job不允许并发执行
        bean.setTargetObject(new Task()); //目标方法所在的实例对象
        bean.setTargetMethod("execute"); //需要执行的方法
        bean.setArguments(100); //需要执行的方法的入参
        return bean;
    }

}

方式2(按配置文件配置加载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直播预约|8月14日,无人系统开发阶段故障注入与安全测试详解

电机失效故障硬件在环仿真 01 培训背景 卓翼飞思实验室暑期公益培训(第六期)将于8月14日&#xff0c;19:00开启&#xff01;通过【飞思实验室】视频号线上直播&#xff0c;由中南大学计算机学院特聘副教授&#xff0c;RflySim平台总研发负责人戴训华副教授主讲。 第六期培训将…

Navicat Premium15 下载与安装(免费版)以及链接SqlServer数据库

转自:https://blog.csdn.net/m0_75188141/article/details/139842565

Hi910X 系列恒压恒流 BUCK 控制器

1. 产品介绍 Hi910X 是一系列外围电路简洁的宽输入电压降压 BUCK 恒压恒流驱动器&#xff0c;适用于 8-150V 输入电压范围的 DCDC 降压应用。Hi9100、Hi9101、Hi9102、Hi9103智芯半导体降压恒压系列 Hi910X 采用我司专利算法&#xff0c;实现高精度的降压恒压恒流。支持输出…

CV每日论文--2024.7.24

1 、AutoAD-Zero: A Training-Free Framework for Zero-Shot Audio Description 中文标题&#xff1a;T2V-CompBench&#xff1a;组合文本到视频生成的综合基准AutoAD-Zero&#xff1a;零样本音频描述的免训练框架 简介&#xff1a;我们的目标是以无需训练的方式为电影和电视剧…

入门岛第2关Python基础知识

任务一 :Python实现wordcount 实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 任务二:debug流程 安装好Python插件在 远程服务器中 在程序中打断点 debug 点击VSCode侧…

haproxy是什么?以及haproxy基础实验

目录 一、什么是负载均衡&#xff1f; 二、为什么要用haproxy&#xff1f; 三、haproxy的基本部署实验&#xff1a; 3.1 基本配置实验 环境准备&#xff1a; 详细步骤&#xff1a; 3.2 haproxy-多进程与多线程实验&#xff1a; 多进程&#xff1a; 多线程&#xff1a;…

【云服务器】 阿里云服务器免费试用3个月 不用学生认证

审核大大&#xff0c;这个真的不是广告呀...也是我琢磨了一下发现的一个方式&#xff0c;阿里云会找我打广告吗&#xff1f;&#xff1f; 这个羊毛不用学生认证&#xff01;&#xff01;只需登录和实名认证和即可 学生实名认证是送优惠券300&#xff0c;我没用上&#xff0c;…

Google 开发者大会(北京站) Play政策会议内容解读

2024年Google开发者大会的会议已结束&#xff0c;很庆幸自己参与了 Google Play 专场&#xff1a;全球视野&#xff0c;助力出海创新与增长 [13:00 - 15:10] 的工作坊内容&#xff0c;受益匪浅。 Google对未来Play市场的愿景&#xff0c;Play Console后台的全新功能&#xff0…

漏洞复现-XXL-JOB accessToken 存在身份认证绕过漏洞

1.漏洞描述 XXL-JOB是许雪里&#xff08;XXL-JOB&#xff09;社区的一款基于java语言的分布式任务调度平台。 2.影响版本 XXL-JOB < 2.2.0 3.影响范围 4.漏洞分析 首先通过微步的漏洞通报说是 src/main/resources/application.properties 默认情况下是非空的&#xff…

HAPropy全功能详解

在一个lvs的环境中&#xff0c;如果服务器出现故障&#xff0c;按照lvs的策略却依然会将访问方式到故障服务器&#xff0c;必然是没有回应的结果&#xff0c;在一个集群中&#xff0c;一台服务器出现故障&#xff0c;理应灵活的去寻找没有故障的服务器&#xff0c;这种方法可以…

免费【2024】springboot 个人博客系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

C语言寻找波峰值

做到项目有需要压力采集的处理&#xff0c;为了便于在程序中计算采集的波形数据&#xff0c;这里简单写一个查找波峰的程序 首先用Python把波峰点找出来&#xff0c; 方便我们对照 我这里主要是判断波峰&#xff0c;波谷的原理也大同小异&#xff0c;改一下程序就行 波峰判断…

顺丰科技2025届校招面试流程、SHL测评题型、笔试题库及答案解析

顺丰科技有限公司成立于2009年&#xff0c;是顺丰旗下专注供应链数智解决方案的科技服务商。我们深耕于供应链数智化十余年&#xff0c;致力于构建卓越的智慧供应链&#xff0c;重塑全球商业文明和生产方式。我们基于对供应链场景的深度理解和行业头部公司的数智化实战经验&…

手机CPU性能天梯图(2024年8月),含安兔兔/GB6/3DMark跑分

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月手机处理器天梯图 2024年8月1日更新日志&#xff1a;由于近期并未有新处理器发布&#xff0c;故只做常规更新&#xff1b;移除鲁大师天梯图&#xff1b;补充其它天梯图数量。 -…

介质套检测方案,如何提升检测效率?

介质套是一种用于保护和装饰电子设备的外壳或套子。这种套子通常由各种材料制成&#xff0c;如硅胶、塑料、皮革等&#xff0c;具有不同的质地和外观风格。介质套可适用于各种电子设备&#xff0c;如手机、平板电脑、笔记本电脑等&#xff0c;为其提供额外的保护&#xff0c;并…

S32G3系列芯片如何从外置flash进行Boot启动?

《S32G3系列芯片——Boot详解》系列——S32G3系列芯片如何从外置flash进行Boot启动&#xff1f; 一、概述二、基于QuadSPI的boot2.1 基于QuadSPI的boot方式概述2.2 IO配置2.3 时钟配置2.4 QuadSPI具体配置参数2.5 系统重置后BootROM对闪存的要求2.6 应用程序对闪存配置的影响 三…

审稿超慢的顶刊,年年投稿量爆涨?年发文量1800+,国人投稿占优!

点击关注&#xff1a;关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; &#x1f525; &#x1f525; &#x1f525; &#x1f525; ELSEVIER旗下1区TOP刊 今天小编给大家介绍的是一本计算机人工智能领域的期刊《Engineering Applications of…

腾讯云AI代码助手:智能AI代码助手 ,新一代的高效代码开发辅助工具

前言 近些年是一个科技大爆发的时代&#xff0c;自从大模型发布以来越来越多的科技产品出现。例如去年的智能编码助手自出现以来&#xff0c;各大老牌大厂腾讯&#xff0c;百度 阿里也都紧随其后&#xff0c;智能编码助手的出现可以说大大的节省了我们写一些冗余代码的时间成本…

滑动窗口 | Java | (hot100) 力扣 3

力扣 3.无重复字符的最长子串 暴力法&#xff1a;双层for循环&#xff0c;i-j的字符查重 滑动窗口&#xff1a;因为这题被分在这个类别里&#xff0c;那么已知要用滑动窗口&#xff0c;思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点&#xff1a;特别容易…

达梦数据库的系统视图v$sql_stat

达梦数据库的系统视图v$sql_stat 达梦数据库的系统视图V$SQL_STAT用于记录当前正在执行的SQL语句的资源开销。这个视图需要启用监控功能&#xff08;即ENABLE_MONITOR1&#xff09;才开始监控。针 对 63~68 列 中 的 监 控 项 &#xff0c; 还 需 开 启 参 数 MONITOR_SQL_EXE…