1. Quartz 介绍

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

2. Quart 实例

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version>
</dependency>
package cn.edu.neu.quartz;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author 32098*/
public class QuartzJob implements Job {/**** @param jobExecutionContext job 执行上下文对象* @throws JobExecutionException ""*/public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 编写业务逻辑System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));}
}
package cn.edu.neu.quartz;import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;/*** @author 32098*/
public class QuartzScheduler {public static void main(String[] args) throws SchedulerException, InterruptedException {// 1. Create SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();// 2. Create JobDetail: Bind Job/** Why?* JobDetail定义的是任务数据(任务名等),而真正的执行逻辑是存在于Job;* 由于任务是有可能并发执行,如果 Scheduler 直接使用Job,就会存在对同一个Job实例并发访问的问题;* 采用 JobDetail & Job 的方式,Scheduler 的每次执行,都会根据 JobDetail 创建一个新的 Job 实例以避免并发访问的问题;*/JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity("time_print_job", "default_job_group").build();// 3. Create Trigger/** Trigger 是 Quartz 的触发器,会去通知 Scheduler 何时去执行对应的 Job*/Trigger trigger = TriggerBuilder.newTrigger().withIdentity("time_print_trigger", "default_trigger_group").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();// 4. 启动schedulerscheduler.scheduleJob(jobDetail, trigger);scheduler.start();}
}

3. Quartz 核心

3.1 Job & JobDetail & JobDataMap(JobDetail)

  • Job 接口
package org.quartz;public interface Job {void execute(JobExecutionContext var1) throws JobExecutionException;
}

  Job 接口只有一个 execute 方法。

  • Job 实现类
      我们通过实现 Job 接口来定义实现特定业务逻辑的 Job 类,如下是一个打印时间的 Job:
package cn.edu.neu.quartz;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author 32098*/
public class QuartzJob implements Job {/**** @param jobExecutionContext job 执行上下文对象* @throws JobExecutionException ""*/public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 编写业务逻辑System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));}
}

在 Job 实现类中,不应该定义有状态的数据属性,因为在 job 的多次执行中,这些属性的值不会保留,需要使用 JobDataMap跟踪 job 的状态

  • JobDetail (接口) 与 JobDetail 的 JobDataMap

    • JobDetail 由 JobBuilder 创建,包含 Job 实例的诸多属性
    • JobDataMap 是 JobDetail 的一部分
    • JobDataMap 中可以包含不限量的(序列化的)数据对象,在 Job 实例执行的时候,可以使用其中的数据
package cn.edu.neu.quartz;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author 32098*/
public class QuartzJob implements Job {String timePrinterName;public void setTimePrinterName(String timePrinterName){this.timePrinterName = timePrinterName;}/**** @param jobExecutionContext job 执行上下文对象* @throws JobExecutionException ""*/public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 编写业务逻辑System.out.println(timePrinterName+"\t"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));// if no timePrinterName and set method of timePrinterName, we need get printerName by
//        String printerName = jobExecutionContext.getJobDetail().getJobDataMap().getString("timePrinterName");
//        System.out.println(printerName+"\t"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));}
}
package cn.edu.neu.quartz;import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;/*** @author 32098*/
public class QuartzScheduler {public static void main(String[] args) throws SchedulerException, InterruptedException {// 1. Create SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();// 2. Create JobDetail: Bind JobJobDetail jobDetail1 = JobBuilder.newJob(QuartzJob.class).withIdentity("time_print_job_1", "default_job_group").usingJobData("timePrinterName", "time_printer_1").build();JobDetail jobDetail2 = JobBuilder.newJob(QuartzJob.class).withIdentity("time_print_job_2", "default_job_group").usingJobData("timePrinterName", "time_printer_2").build();// 3. Create TriggerTrigger trigger1 = TriggerBuilder.newTrigger().withIdentity("time_print_trigger1", "default_trigger_group").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity("time_print_trigger2", "default_trigger_group").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();// 4. 启动schedulerscheduler.scheduleJob(jobDetail1, trigger1);scheduler.scheduleJob(jobDetail2, trigger2);scheduler.start();}
}

3.2 Trigger

3.2.1 SimpleTrigger
  • SimpleTrigger 满足的调度需求:

    • 在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次
  • SimpleTrigger 的重要设置项
    • 开始时间
    • 结束时间
    • 重复次数
    • 重复间隔
  • SimpleScheduleBuilder

使用见上例

3.2.2 CronTrigger
  • CronTrigger 与 Simple Trigger 不同,其调度是基于日历的而不是按照SimpleTrigger的精确指定间隔进行作业调度
  • 但是,CronTrigger 和 SimpleTrigger 都有一个 startTime(指定何时生效),以及一个可选的 endTime(指定何时停止计划)
  • Cron Expressions 表达式
    • Cron Expressions是由七个子表达式组成的字符串,用于描述日程表的各个细节(子表达式用空格分隔)
    • Cron Expressions 的七个子表达式:
      1. Seconds:0-59
      2. Minutes:0-59
      3. Hours:0-23
      4. Day-of-Month:日期可以是1-31的任何值,但需注意给定月份的天数
      5. Month:月份可以指定为0到11之间的值,或者使用字符串JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC
      6. Day-of-Week:星期几可以指定为1到7(1 =星期日)之间的值,或者使用字符串SUN,MON,TUE,WED,THU,FRI和SAT
      7. Year:optional field
    • 其它
      • *:对应字段的所有可能值,如周(Day-of-Week)
      • /:用于指定值的增量,0/15 (分钟)——每隔15分钟,从零开始
      • LW#
  • 一些调度要求太复杂,无法用单一触发表示时,可以创建两个或多个触发器,并注册它们来运行相同的作业
  • CronScheduleBuilder

4. TriggerListeners & JobListeners & SchedulerListener

  • Listeners 是我们创建的对象,用于根据调度程序中发生的事件执行恰当的操作
  • TriggerListeners 接收到与 trigger 相关的事件(触发器触发、触发器失灵、触发器完成),JobListeners 接收与 job 相关的事件(job即将执行的通知、job完成执行时的通知),SchedulerListeners 接受与计划程序相关的事件(添加job/触发器、删除job/触发器、调度程序中的严重错误、关闭调度程序的通知等)
  • Listeners 注册到调度程序的 ListenerManager

5. Quartz 配置:见 http://www.quartz-scheduler.org/documentation/quartz-2.3.0/configuration/

Quartz Learn相关推荐

  1. Spring Boot定时任务-SpringBoot整合Quartz

    如何通过SpringBoot整合Quartz框架,我们首先去创建一个项目,接下来我们需要在pom文件里添加坐标,我们在使用SpringBoot整合Quartz的时候,需要添加哪些坐标呢,我们来看一下, ...

  2. Spring Boot定时任务-Quartz基本使用

    我们在项目当中去使用一个Quartz,主要是了解Quartz的一个基本使用方式,Quartz的基本使用方式,首先打开我们的eclipse,使用SpringBoot去整合我们的Quartz,我们就不加S ...

  3. 绘图与滤镜全面解析--Quartz 2D 、Core Image

    绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2 ...

  4. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  5. SpringBoot中实现quartz定时任务

    Quartz整合到SpringBoot(持久化到数据库) 背景 最近完成了一个小的后台管理系统的权限部分,想着要扩充点东西,并且刚好就完成了一个自动疫情填报系统,但是使用的定时任务是静态的,非常不利于 ...

  6. Java基于Quartz的定时任务调度服务(一)

    Quartz的基本用法 一 Quartz的简单介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的 ...

  7. Blender赛车动画制作学习教程 Learn Race Car Animation with Blender

    使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender.免费下载和免费用于任何 ...

  8. Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)

    要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...

  9. Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#

    游戏开发变得容易了.使用Unity学习C#并创建您自己的3D平台! 你会学到什么 学习现代通用编程语言C#. 了解Unity中3D开发的功能 发展强大的可转移的解决问题的技能 了解游戏开发过程 了解面 ...

最新文章

  1. WebService – 3.后台调用WebService,根级别上的数据无效
  2. php对json随机排序,按月对PHP JSON数组进行排序
  3. 开放寻址法VS链表法
  4. 两个pdf怎么打开成两个窗口_如何将图片合并成PDF?教你两个免费方法
  5. linux环境下最简单的C语言例子
  6. .Net Core WebApi(三)在Linux服务器上部署
  7. 【Android】自定义 Tabhost
  8. centos mysql
  9. atitit.验证码识别step2------剪贴板ClipBoard copy image图像 attilax总结
  10. 破解密码很难?利用Python自动编写暴力破解字典,黑客必学技能!
  11. Unity简单实现调用电脑打印机打印图片功能
  12. 战德臣计算机导论第5讲,地方高校“计算机导论”算法思维培养的教学设计
  13. 【折腾】GitHub Actions 反代 RSSHub + 多实例轮询
  14. outlook客户端不显示table表格边框线的问题
  15. 麦吉尔大学计算机工程的世界排名,不只是知名大学:麦吉尔大学你需要知道这些!...
  16. 小学生数量成为楼市风向标?
  17. 面试被问离职原因,别乱说
  18. 示例:波士顿房价预测
  19. 股票挂钩产品的设计、定价和避险原理
  20. 华为存储服务器lun丢失数据恢复方案

热门文章

  1. PythonGUI自动化:UIAUTOMATION(一)
  2. 通过试读《增长黑客》所带来的思考
  3. CornerRadius圆角属性
  4. AssertValid函数学�
  5. 谈谈安卓的Bitmap与Drawable
  6. php获取基站,基站查询API接口_免费数据接口 - 极速数据
  7. 大学毕业第一年 我就送了一年外卖 哭了整整一晚
  8. 如何在html中插入背景音乐
  9. 2022年“计算机检测维修与数据恢复”国赛模拟赛考试圆满成功
  10. 刚出生产线上的工业路由器,为何还要做老化测试?