iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java任务调度框架Quartz怎么使用
  • 752
分享到

Java任务调度框架Quartz怎么使用

2023-06-22 02:06:04 752人浏览 独家记忆
摘要

本篇内容介绍了“Java任务调度框架Quartz怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Quartz相较于Time

本篇内容介绍了“Java任务调度框架Quartz怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

     Quartz相较于Timer, Quartz增加了很多功能:

    • 持久性作业 - 就是保持调度定时的状态;

    • 作业管理 - 对调度作业进行有效的管理;

    1、Quartz

    1.1 引入依赖

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

    1.2 入门案例

    任务:将任务类执行 10 次,每次间隔 3 秒。

    任务类,需要实现 Job 接口
    package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.text.SimpleDateFORMat;import java.util.Date;public class HelloJob implements Job {    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        // 获取当前时间,并格式化        Date date = new Date();        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String dateSrting = format.format(date);        // 业务功能模拟        System.out.println("开始备份数据库,时间:" + dateSrting);    }}
    定时器类
    package com.sugar.quartz.utils;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;public class HelloSchedulerDemo {    public static void main(String[] args) throws SchedulerException {        // 1、调度器 - 从工厂获取调度实例        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();        // 2、任务实例 - 执行的任务对象        JobDetail job = JobBuilder.newJob(HelloJob.class)                .withIdentity("job1", "group1") // 任务名称,组名称                .build();        // 3、触发器 - 控制执行次数和执行时间        Trigger trigger = TriggerBuilder.newTrigger()                .withIdentity("trigger1", "group1") // 同上                .startNow() // 立刻启动                .withSchedule(SimpleScheduleBuilder.simpleSchedule().                        withIntervalInSeconds(3).                        withRepeatCount(10))   // 循环10次,每次间隔3s                .build();        // 调度器关联触发器,并启动        scheduler.scheduleJob(job,trigger);        scheduler.start();    }}

    1.3 Job 与 JobDetail

    • Job:基于反射的任务调度接口,所有任务类都要实现该接口,在接口的 execute 里编写自己的业务逻辑。

    • Job 生命周期:每次执行 Job,在 execute 方法前会创建新的 Job实例,调用后实例被释放,再被GC回收。

    • JobDetail:封装 Job,给 Job 实例提供许多属性。

    • JobDetail 属性:name、group、jobClass、jobDataMap。

    1.4 JobExecutionContext

    下文将 JobExecutionContext 简称为 JEC

    • JEC :当调度器调用 Job 时,会将 JEC 传递给 Job 的 execute 方法。

    • JEC 作用:Job 通过 JEC 获取运行环境信息,以及 Job 信息。

    1.5 JobDataMap

    下文将 JobDataMap 简称为 JDM

    • JDM:任务调度时,JDM 存储在 JEC 中,方便获取。

    • JDM 优点:实现 Map 接口,可以存取任何可序列化对象,Job 执行时会将参数传给 JDM。

    手动获取 JDM 参数案例

    HelloSchedulerDemo:

    package com.sugar.quartz.utils;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;public class HelloSchedulerDemo {    public static void main(String[] args) throws SchedulerException {        // 1、调度器 - 从工厂获取调度实例        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();        // 2、任务实例 - 执行的任务对象        JobDetail job = JobBuilder.newJob(HelloJob.class)                .withIdentity("job1", "group1") // 任务名称,组名称                .usingJobData("msg","JDM使用 - Detail")    // JDM 传递参数                .build();        // 3、触发器 - 控制执行次数和执行时间        Trigger trigger = TriggerBuilder.newTrigger()                .withIdentity("trigger1", "group1") // 同上                .startNow() // 立刻启动                .withSchedule(SimpleScheduleBuilder.simpleSchedule().                        withIntervalInSeconds(3).                        withRepeatCount(10))   // 循环10次,每次间隔3s                .usingJobData("msg","JDM使用 - Trigger")                .build();        // 调度器关联触发器,并启动        scheduler.scheduleJob(job,trigger);        scheduler.start();    }}

    HelloJob:

    package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;import java.util.Date;public class HelloJob implements Job {    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        // 获取当前时间,并格式化        Date date = new Date();        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String dateSrting = format.format(date);        // 获取 JDM        JobDataMap Detail_JDM = context.getJobDetail().getJobDataMap();        JobDataMap Trigger_JDM = context.getTrigger().getJobDataMap();        String detail_jdmString = Detail_JDM.getString("msg");        String trigger_jdmString = Trigger_JDM.getString("msg");        System.out.println("---------------------------------------------------");        System.out.println("detail_jdmString = " + detail_jdmString);        System.out.println("trigger_jdmString = " + trigger_jdmString);        // 业务功能模拟        System.out.println("开始备份数据库,时间:" + dateSrting);        // 其他内容        System.out.println("Job 运行时间:" + context.getJobRunTime());        System.out.println("Job 当前运行时间:" + context.getFireTime());        System.out.println("Job 下次运行时间:" + context.getNextFireTime());        System.out.println("---------------------------------------------------");    }}

    2、Job 类实现 JDM 参数的 Setter 方法,实例化时自动绑定参数

    HelloJob:

    // 实例化时自动绑定 JDM key对应的值private String msg;public void setMsg(String msg) {    this.msg = msg;}// 获取 JDMSystem.out.println(Trigger JDM : " + msg);
    • 问题:上文中 JobDetail 和 Trigger 中的 JDM 的 key 均为 "msg",那此 msg 是哪一个?

    • E.g:遇到同名key,Trigger 会覆盖 JobDetail 的值,所以 msg 为 Trigger JDM 的值。

    1.6 Job 状态

    • 有状态 Job:多次调用 Job 期间,公用同一个 JDM。

    • 有状态 Job:多次调用 Job 期间,每次新建一个新的 JDM。

    有无状态 Job 区别案例

    预期:无状态 count 输出永远为 1,有状态 count 输出累加。

    HelloSchedulerDemo:

    // JobDeatil 添加一个 JDM,用做计数器.usingJobData("count",0)

    无状态 HelloJob:

    package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;import java.util.Date;public class HelloJob implements Job {    // 实例化时自动绑定 JDM key对应的值    private String msg;    private Integer count;    public void setMsg(String msg) {        this.msg = msg;    }    public void setCount(Integer count) {        this.count = count;    }    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        // 获取当前时间,并格式化        Date date = new Date();        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String dateSrting = format.format(date);        // 获取 JDM        System.out.println("---------------------------------------------------");        System.out.println("Trigger JDM : " + msg);         System.out.println("Count : " + count);                // 更新 JobDetail JDM 的 count        count++;        context.getJobDetail().getJobDataMap().put("count",count);        // 业务功能模拟        System.out.println("开始备份数据库,时间:" + dateSrting);        // 其他内容        System.out.println("Job 运行时间:" + context.getJobRunTime());        System.out.println("Job 当前运行时间:" + context.getFireTime());        System.out.println("Job 下次运行时间:" + context.getNextFireTime());        System.out.println("---------------------------------------------------");    }}

    有状态 HelloJob:

    // 任务类加上下面注解,多次调用 Job,会持久化 Job,JDM 的数据会被保存,供下次使用@PersistJobDataAfterExecution

    1.7 Trigger

    • Trigger 常用SimpleTriggerCronTrigger

    • JobKey:Job 实例标识,触发器触发时,执行 JobKey 对应任务。

    • StartTime:第一次触发时间。

    • EndTime:终止触发时间。

    Trigger 获取参数案例

    HelloSchedulerTriggerDemo:

    package com.sugar.quartz.utils;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;import java.util.Date;public class HelloSchedulerTriggerDemo {    public static void main(String[] args) throws SchedulerException {        // 任务开始时间推迟 3 s,结束时间推迟 10 s        Date startData = new Date();        startData.setTime(startData.getTime() + 3000);        Date endData = new Date();        endData.setTime(endData.getTime() + 10000);        // 1、调度器 - 从工厂获取调度实例        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();        // 2、任务实例 - 执行的任务对象        JobDetail job = JobBuilder.newJob(helloJobTrigger.class)                .withIdentity("job1", "group1") // 任务名称,组名称                .usingJobData("msg","JDM使用 - Detail")    // JDM 传递参数                .build();        // 3、触发器 - 控制执行次数和执行时间        Trigger trigger = TriggerBuilder.newTrigger()                .withIdentity("trigger1", "group1") // 同上                .startNow() // 立刻启动                .startAt(startData)                .endAt(endData)                .build();        // 调度器关联触发器,并启动        scheduler.scheduleJob(job,trigger);        scheduler.start();    }}

    helloJobTrigger:

    package com.sugar.quartz.utils;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.PersistJobDataAfterExecution;import java.text.SimpleDateFormat;import java.util.Date;@PersistJobDataAfterExecutionpublic class helloJobTrigger implements Job {    @Override    public void execute(JobExecutionContext context) throws JobExecutionException {        // 获取当前时间,并格式化        Date date = new Date();        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        String dateSrting = format.format(date);        // 业务功能模拟        System.out.println("---------------------------------------------------");        System.out.println("开始备份数据库,时间:" + dateSrting);        // 获取 JobKey,StartTime,EndTime        System.out.println("JobKey : " + context.getTrigger().getJobKey());        System.out.println("StartTime : " + format.format(context.getTrigger().getStartTime()));        System.out.println("EndTime : " + format.format(context.getTrigger().getEndTime()));        System.out.println("---------------------------------------------------");    }}// 运行结果---------------------------------------------------开始备份数据库,时间:2021-12-13 23:25:06JobKey : group1.job1StartTime : 2021-12-13 23:25:06EndTime : 2021-12-13 23:25:13---------------------------------------------------

    1.8 SimpleTripper

    下文将 SimpleTripper 简称为 ST

    • ST:特定时间范围启动/结束,且以一个时间间隔重复 n 次 Job 所设计。

    • ST 属性:开始时间、结束时间、重复次数和时间间隔。

    • ST 提示:指定了结束时间,那么结束时间优先级 > 重复次数。

    “Java任务调度框架Quartz怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Java任务调度框架Quartz怎么使用

    本文链接: https://www.lsjlt.com/news/301853.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java任务调度框架Quartz怎么使用
      本篇内容介绍了“Java任务调度框架Quartz怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Quartz相较于Time...
      99+
      2023-06-22
    • 任务调度框架Quartz怎么使用
      要使用Quartz任务调度框架,您可以按照下面的步骤进行操作:1. 引入Quartz依赖:您可以在项目的构建文件中引入Quartz的...
      99+
      2023-09-21
      Quartz
    • Java 任务调度框架 Quartz实操
      目录1、Quartz 1.1 引入依赖 1.2 入门案例 任务类,需要实现 Job 接口 定时器类 1.3 Job 与 JobDetail 1.4 JobExecutionConte...
      99+
      2024-04-02
    • java任务调度quartz怎么使用
      要使用Quartz任务调度器,您需要按照以下步骤进行操作:1. 首先,您需要添加Quartz的依赖项到您的项目中。您可以在Maven...
      99+
      2023-08-14
      java quartz
    • java任务调度框架怎么使用
      Java任务调度框架通常用于在指定的时间间隔或特定时间点执行任务。常见的Java任务调度框架有Quartz和Spring Task。...
      99+
      2023-09-13
      java
    • python任务调度框架怎么使用
      Python任务调度框架最常用的是APScheduler,下面是APScheduler的使用步骤:1. 安装APScheduler:...
      99+
      2023-09-21
      python
    • golang任务调度框架怎么使用
      在Go语言中,可以使用多种任务调度框架来进行任务的管理和调度,例如:1. Gin: Gin是一个高性能的Go语言Web框架,它支持路...
      99+
      2023-09-13
      golang
    • java任务调度quartz怎么实现
      使用Quartz实现Java任务调度的步骤如下:1. 导入Quartz库:在项目的依赖管理中,添加Quartz库的Maven或Gra...
      99+
      2023-09-18
      quartz java
    • .net任务调度框架FluentScheduler怎么使用
      这篇文章主要介绍“.net任务调度框架FluentScheduler怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.net任务调度框架FluentScheduler怎么使用”文章能帮助大家解...
      99+
      2023-07-02
    • .net任务调度框架Hangfire怎么使用
      这篇文章主要讲解了“.net任务调度框架Hangfire怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.net任务调度框架Hangfire怎么使用”吧!简单使用:这里就简单的演示.n...
      99+
      2023-07-02
    • quartz任务调度怎么实现
      在Java中,可以使用Quartz任务调度框架来实现任务调度。以下是实现Quartz任务调度的一般步骤:1. 添加依赖:在项目的构建...
      99+
      2023-08-31
      quartz
    • quartz集群任务调度怎么应用
      Quartz是一个开源的Java任务调度框架,可以用于在一个集群中调度任务。下面是使用Quartz集群任务调度的一般步骤:1. 配置...
      99+
      2023-10-20
      quartz
    • Python强大的任务调度框架Celery怎么使用
      本篇内容介绍了“Python强大的任务调度框架Celery怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是 celery这次我们...
      99+
      2023-07-06
    • golang任务调度框架怎么实现
      要实现一个Golang任务调度框架,可以按照以下步骤进行: 定义任务结构体:首先,定义一个任务结构体,包含任务的属性,例如任务的I...
      99+
      2023-10-25
      golang
    • 详解定时任务框架Quartz的使用
      目录一、什么是Quartz二、Quartz Demo搭建三、Quartz核心详解一、什么是Quartz 什么是Quartz Quartz是OpenSymphony开源组织在Job s...
      99+
      2023-02-13
      定时任务框架Quartz使用 定时任务框架Quartz
    • web分布式定时任务调度框架怎么使用
      这篇文章主要讲解了“web分布式定时任务调度框架怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web分布式定时任务调度框架怎么使用”吧!一、业务背景1.1 为什么需要使用定时任务调度...
      99+
      2023-06-04
    • .net任务调度框架FluentScheduler简介
      之前我在文章中介绍过.net中的任务调度框架Hangfire,HangFire虽然本身输入比较简单好用的,但是,如果我们的程序本身提供的服务不是任务调度,而任务调度只是里面并不重要的...
      99+
      2024-04-02
    • .net任务调度框架Hangfire简介
      任务调度是我们项目中常见的功能,虽然任务调度的功能实现本身并不难,但一个好用的轮子还是可以给我们的开发的效率提升不少的。 在.net环境中,较为有名的任务调度框架是HangFire与...
      99+
      2024-04-02
    • Python 强大的任务调度框架 Celery!
      什么是 celery这次我们来介绍一下 Python 的一个第三方模块 celery,那么 celery 是什么呢? celery 是一个灵活且可靠的,处理大量消息的分布式系统,可以在多个节点之间处理某个任务; celery 是一个专注于实...
      99+
      2023-05-14
      Python 框架 Celery
    • java rpc调用框架怎么使用
      使用Java RPC调用框架可以按照以下步骤进行: 导入相关的依赖包:根据选择的RPC框架,导入相应的依赖包,例如使用Apach...
      99+
      2023-10-23
      java rpc
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作