Quartz任务调度

news2024/12/26 12:28:12

Quartz概念

Quartz是openSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用。

Quartz是开源且具有丰富特性的“任务调度库”,能够集成于任何的Java应用,小到独立的应用,大到电子商业系统。Quartz能够创建亦简单亦复杂的调度,以执行上百、千,甚至上万的任务。任务job被定义为标准的Java组件,能够执行任何你想要实现的功能。

官网:http://www.quartz-scheduler.org/

Quartz运行环境

Quartz可以运行嵌入在另一个独立式应用程序
Quartz可以在应用程序服务器(或servlet容器)内被实例化,并且参与事务
Quartz可以作为一个独立的程序运行(其自己的Java虚拟机内),可以通过RMI使用
Quartz可以被实例化,作为独立的项目集群(负载均衡和故障转移功能),用于作业的执行

Quartz设计模式

Builder模式
Factory模式
组件模式
链式模式

Quartz的核心概念

1、任务job
Job就是你想要实现的任务类,每一个Job必须实现org.quartz.job接口,且只需要实现接口定义的execute()方法。

2、触发器Trigger
Trigger为你执行任务的触发器。不如说每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。
Trigger主要包含两种: SimpleTrigger 和 CronTrigger两种。

3、调度器Scheduler
Scheduler为任务的调度器,它会将任务job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job。

Quartz的体系结构

在这里插入图片描述

Quartz的几个常用API

以下是Quartz编程API几个重要接口,也是Quartz的重要组件

1、Scheduler
用于与调度程序交互的主程序接口
Scheduler调度程序通过任务执行计划表,只有安排进执行计划的任务Job(通过scheduler.scheduleJob方法安排进执行计划),当它预先定义的执行时间到了的时候(任务触发trigger),该任务才会执行。

2、Job
我们预先定义的希望在未来时间能够被调度程序执行的任务类,我们可以自定义

3、JobDetail
使用JobDetail来定义定时任务的实例,JobDetail实例通过JobBuilder类创建的。

4、JobDataMap
可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法。

5、Trigger触发器
Trigger对象是用来触发执行job的。当调度一个job时,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比方说每两秒钟执行一次。

6、JobBuilder
用于声明一个任务实例,也可以定义关于该任务的详情,比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。

7、TriggerBuilder
触发器创建器,用于创建触发器trigger实例

8、JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听

Quartz的使用

入门案例

新建maven项目,导入依赖

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.3.0</version>
        </dependency>

创建HelloJob任务类

package com.affection.quartz.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 邢道荣
 * @date 2022/12/9 14:25
 */
public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 输出当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = sdf.format(date);
        // 工作内容

        System.out.println("数据库正在进行备份,备份时间是:" + dateString);
    }
}

然后创建任务调度类HelloSchedulerDemo

package com.affection.quartz.job;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author 邢道荣
 * @date 2022/12/9 14:30
 */
public class HelloSchedulerDemo {
    public static void main(String[] args) throws Exception {
        // 1、调度器(Scheduler)
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 2、任务实例(JobDetail)
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1", "group1") //参数1: 任务的名称(唯一实例); 参数二: 任务组的名称
                .build();

        // 3、触发器(Trigger)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1") // 参数1:触发器的名称(唯一实例); 参数2:触发器组的名称
                .startNow() // 马上启动触发器
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
                .build();

        // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

Job与JobDetail介绍

Job:工作任务调度的接口,任务类需要实现该接口。该接口中定义了execute方法,类似于JDK提供的TimeTask类的run方法。在里面编写任务执行的业务逻辑。

Job实例在Quartz中的生命周期:每次调度器执行Job时,它在调用execute方法前会创建一个新的job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。

JobDetail: JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。

JobDetail重要属性:name、group、jobClass、JobDataMap

JobExecutionContext介绍

当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;

Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

public class HelloJob implements Job {


    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 输出当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = sdf.format(date);
        // 工作内容
        System.out.println("数据库正在进行备份,备份时间是:" + dateString);

        JobKey jobKey = context.getJobDetail().getKey();
        System.out.println("工作任务名称:" + jobKey.getName() + "; 工作任务的组:" + jobKey.getGroup());
        System.out.println("任务类的名称:" + context.getJobDetail().getJobClass().getSimpleName());
    }
}

JobDataMap介绍

(1)、使用Map获取。
在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取。
JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。
JobDataMap实现了JDK的Map接口,并且添加了非常方便的方法用来存取基本数据类型。

public class HelloJob implements Job {


    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 输出当前时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = sdf.format(date);
        // 工作内容
        System.out.println("数据库正在进行备份,备份时间是:" + dateString);

        JobKey jobKey = context.getJobDetail().getKey();
        System.out.println("工作任务名称:" + jobKey.getName() + "; 工作任务的组:" + jobKey.getGroup());
        System.out.println("任务类的名称:" + context.getJobDetail().getJobClass().getName());
        System.out.println("任务类的名称:" + context.getJobDetail().getJobClass().getSimpleName());

        // 从JobDetail对象中获取JobDataMap的数据
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String message = jobDataMap.getString("message");
        System.out.println("任务数据的参数值:" + message);

        // 获取Trigger对象中获取jobDataMap的数据
        JobDataMap jobDataMapTrigger = context.getTrigger().getJobDataMap();
        String messageTriagger = jobDataMapTrigger.getString("message");
        System.out.println("触发器数据的参数值:" + messageTriagger);

        // 获取Trigger的内容
        TriggerKey triggerKey = context.getTrigger().getKey();
        System.out.println("触发器名称:" + triggerKey.getName() + " ;  触发器组: " + triggerKey.getGroup());
    }
}

public class HelloSchedulerDemo {
    public static void main(String[] args) throws Exception {
        // 1、调度器(Scheduler)
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 2、任务实例(JobDetail)
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1", "group1") //参数1: 任务的名称(唯一实例); 参数二: 任务组的名称
                .usingJobData("message", "打印日志")  // 传递参数,名称message
                .build();


        // 3、触发器(Trigger)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1") // 参数1:触发器的名称(唯一实例); 参数2:触发器组的名称
                .startNow() // 马上启动触发器
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
                .usingJobData("message", "simple触发器") // 传递参数,名称 message
                .build();

        // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

(2)、Job实现类中添加setter方法对应JobDataMap的键值,Quartz框架默认的JobFactory实现类在初始化Job实例对象时会自动地调用这些setter方法。

public class HelloJob implements Job {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println(message);
    }
}

如果遇到同名的key,Trigger中的usingJobData会覆盖JobDetail中的usingJobData。

有状态的Job与无状态的Job

@PersistJobDataAfterExecution注解的使用

有状态的Job可以理解为多次调用Job期间可以持有一些状态信息,这些状态信息存储在JobDataMap中,而默认的无状态job每次调用时都会创建一个新的JobDataMap。

@PersistJobDataAfterExecution // 多次调用Job的时候,会对Job进行持久化,即保存一个数据的信息
public class HelloJob implements Job {
    private Integer count;

    public void setCount(Integer count) {
        this.count = count;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 累加count
        ++count;
        // 将count存放到JobDataMap中
        context.getJobDetail().getJobDataMap().put("count", count);
        System.out.println("count的数量:" + count);
    }
}

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

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

相关文章

支持向量机SVM

文章目录SVM简单理解SVM代码实现导入数据集SVM实现画出支持向量总结SVM简单理解 在下二维平面存在以下数据点&#xff0c;不同颜色代表不同类别&#xff0c;现在需要画一条直线&#xff0c;想将两个类别分别开来&#xff0c;当有新数据加入时&#xff0c;根据这条直线&#xf…

springboot+jsp母婴用品商城网站系统

开发语言&#xff1a;Java 后端框架&#xff1a;springboot(SpringSpringMVCMyBatis) 前端框架&#xff1a;jsp 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 母婴用品网站&#xff0…

客快物流大数据项目(九十六):ClickHouse的VersionedCollapsingMergeTree深入了解

文章目录 ClickHouse的VersionedCollapsingMergeTree深入了解 一、创建VersionedCollapsingMergeTree引擎表的语法 二、折叠数据

人工智能轨道交通行业周刊-第26期(2022.12.5-12.11)

本期关键词&#xff1a;智慧检修、障碍物检测、监管数据平台、ChatGPT、脑机接口、图像增强 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁…

Canvas 性能优化:脏矩形渲染

大家好&#xff0c;我是前端西瓜哥。 使用 Canvas 做图形编辑器时&#xff0c;我们需要自己维护自己的图形树&#xff0c;来保存图形的信息&#xff0c;并定义元素之间的关系。 我们改变画布中的某个图形&#xff0c;去更新画布&#xff0c;最简单的是清空画布&#xff0c;然…

Java项目:SSM个人博客管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 发博客,审核评论,博客增删改查,博客类别增删改查,修改导航,评论增删改查,个人信息修改,登陆页面等功能。 …

TOOD: Task-aligned One-stage Object Detection 原理与代码解析

paper&#xff1a;TOOD: Task-aligned One-stage Object Detection code&#xff1a;https://github.com/fcjian/TOOD 存在的问题 目标检测包括分类和定位两个子任务&#xff0c;分类任务学习的特征主要关注物体的关键或显著区域&#xff0c;而定位任务是为了精确定位整个…

SpringBoot yaml语法详解

SpringBoot yaml语法详解1.yaml基本语法2.yaml给属性赋值3.JSR303校验4.SpringBoot的多环境配置1.yaml基本语法 通常情况下&#xff0c;Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yaml 作为其默认配置文件&#xff0c;我们可以在该…

【云原生 | Kubernetes 实战】11、K8s 控制器 Deployment 入门到企业实战应用(下)

目录 四、通过 k8s 实现滚动更新 4.3 自定义滚动更新策略 取值范围 建议配置 总结 测试&#xff1a;自定义策略 重建式更新&#xff1a;Recreate 五、生产环境如何实现蓝绿部署&#xff1f; 5.1 什么是蓝绿部署&#xff1f; 5.2 蓝绿部署的优势和缺点 优点&#x…

图数据库 Neo4j 学习之JAVA-API操作

Neo4j 系列 1、图数据库 Neo4j 学习随笔之基础认识 2、图数据库 Neo4j 学习随笔之核心内容 3、图数据库 Neo4j 学习随笔之基础操作 4、图数据库 Neo4j 学习随笔之高级操作 5、图数据库 Neo4j 学习之JAVA-API操作 6、图数据库 Neo4j 学习之SpringBoot整合 文章目录Neo4j 系列前…

mac pro M1(ARM)安装vmware虚拟机及centos8详细教程

前言 mac发布了m1芯片&#xff0c;其强悍的性能收到很多开发者的追捧&#xff0c;但是也因为其架构的更换&#xff0c;导致很多软件或环境的安装成了问题&#xff0c;这次我们接着来看如何在mac m1环境下安装centos8 Centos8安装安装vmware虚拟机Centos8 镜像支持M1芯片安装Cen…

DDPM原理与代码剖析

前言 鸽了好久没更了&#xff0c;主要是刚入学学业压力还蛮大&#xff0c;挺忙的&#xff0c;没时间总结啥东西。 接下来就要好好搞科研啦。先来学习一篇diffusion的经典之作Denoising Diffusion Probabilistic Models(DDPM)。 先不断前向加高斯噪声&#xff0c;这一步骤称为…

论文笔记(二十三):Predictive Sampling: Real-time Behaviour Synthesis with MuJoCo

Predictive Sampling: Real-time Behaviour Synthesis with MuJoCo文章概括摘要1. 介绍2. 背景3. MuJoCo MPC (MJPC)3.1. 物理模拟3.2. 目标3.3. 样条3.4. 规划师4. 结论4.1. 图形用户界面4.2. 例子5. 讨论5.1. 预测抽样5.2. 用例5.3. 局限和未来的工作文章概括 作者&#xff…

25-Vue之ECharts-基本使用

ECharts-基本使用前言ECharts介绍ECharts快速上手ECharts配置说明前言 本篇开始来学习下开源可视化库ECharts ECharts介绍 ECharts是百度公司开源的一个使用 JavaScript 实现的开源可视化库&#xff0c;兼容性强&#xff0c;底层依赖矢量图形 库 ZRender &#xff0c;提供直…

Oracle High Water Mark问题

公司写SQL时遇到一个奇怪的问题&#xff0c;往表中频繁插入和删除大量数据&#xff0c;几次操作后&#xff0c;使用Select查询(表中没数据)特别慢&#xff0c;后得知是高水位线的问题。 该问题已通过: truncate table tableName语句解决。 本想写篇文章详细记录一下的&#xff…

操作系统,计算机网络,数据库刷题笔记9

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记9 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff…

聊聊远程项目交付的敏捷管理

这是鼎叔的第四十三篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本人专栏和微信公众号《敏捷测试转型》&#xff0c;大量原创思考文章陆续推出。 对于日益重要的国际化市场&#xff0c;越来越多的离岸项目&#xff08;内包或外包&#xff09;在…

这十套练习,教你如何用Pandas做数据分析(09)

练习9-时间序列 探索Apple公司股价数据 步骤1 导入必要的库 运行以下代码 import pandas as pd import numpy as np visualization import matplotlib.pyplot as plt %matplotlib inline 步骤2 数据集地址 运行以下代码 path9 ‘…/input/pandas_exercise/pandas_exer…

CVE-2019-11043(PHP远程代码执行漏洞)复现

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CVE-2019-11043&#xff08;PHP远程代码执行漏洞&#xff09;复现。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&am…

【hexo系列】02.hexo和obsidian实现笔记丝滑

文章目录hexo主题hexo进阶hexo插件&#xff1a;自动生成目录hexo插件&#xff1a;自动生成目录序号&#xff08;自行选用&#xff09;obsidian插件&#xff1a;templater安装插件配置插件定制模板新建笔记参考资料hexo主题 hexo主题大全 cd blog git clone https://github.co…