Quartz Learn
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 的七个子表达式:
- Seconds:0-59
- Minutes:0-59
- Hours:0-23
- Day-of-Month:日期可以是1-31的任何值,但需注意给定月份的天数
- Month:月份可以指定为0到11之间的值,或者使用字符串JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC
- Day-of-Week:星期几可以指定为1到7(1 =星期日)之间的值,或者使用字符串SUN,MON,TUE,WED,THU,FRI和SAT
- Year:optional field
- 其它
*
:对应字段的所有可能值,如周(Day-of-Week)/
:用于指定值的增量,0/15 (分钟)——每隔15分钟,从零开始L
、W
、#
等
- 一些调度要求太复杂,无法用单一触发表示时,可以创建两个或多个触发器,并注册它们来运行相同的作业
- 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相关推荐
- Spring Boot定时任务-SpringBoot整合Quartz
如何通过SpringBoot整合Quartz框架,我们首先去创建一个项目,接下来我们需要在pom文件里添加坐标,我们在使用SpringBoot整合Quartz的时候,需要添加哪些坐标呢,我们来看一下, ...
- Spring Boot定时任务-Quartz基本使用
我们在项目当中去使用一个Quartz,主要是了解Quartz的一个基本使用方式,Quartz的基本使用方式,首先打开我们的eclipse,使用SpringBoot去整合我们的Quartz,我们就不加S ...
- 绘图与滤镜全面解析--Quartz 2D 、Core Image
绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2 ...
- 【Kaggle Learn】Python 1-4
[Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...
- SpringBoot中实现quartz定时任务
Quartz整合到SpringBoot(持久化到数据库) 背景 最近完成了一个小的后台管理系统的权限部分,想着要扩充点东西,并且刚好就完成了一个自动疫情填报系统,但是使用的定时任务是静态的,非常不利于 ...
- Java基于Quartz的定时任务调度服务(一)
Quartz的基本用法 一 Quartz的简单介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的 ...
- Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender.免费下载和免费用于任何 ...
- Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)
要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...
- Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#
游戏开发变得容易了.使用Unity学习C#并创建您自己的3D平台! 你会学到什么 学习现代通用编程语言C#. 了解Unity中3D开发的功能 发展强大的可转移的解决问题的技能 了解游戏开发过程 了解面 ...
最新文章
- WebService – 3.后台调用WebService,根级别上的数据无效
- php对json随机排序,按月对PHP JSON数组进行排序
- 开放寻址法VS链表法
- 两个pdf怎么打开成两个窗口_如何将图片合并成PDF?教你两个免费方法
- linux环境下最简单的C语言例子
- .Net Core WebApi(三)在Linux服务器上部署
- 【Android】自定义 Tabhost
- centos mysql
- atitit.验证码识别step2------剪贴板ClipBoard copy image图像 attilax总结
- 破解密码很难?利用Python自动编写暴力破解字典,黑客必学技能!
- Unity简单实现调用电脑打印机打印图片功能
- 战德臣计算机导论第5讲,地方高校“计算机导论”算法思维培养的教学设计
- 【折腾】GitHub Actions 反代 RSSHub + 多实例轮询
- outlook客户端不显示table表格边框线的问题
- 麦吉尔大学计算机工程的世界排名,不只是知名大学:麦吉尔大学你需要知道这些!...
- 小学生数量成为楼市风向标?
- 面试被问离职原因,别乱说
- 示例:波士顿房价预测
- 股票挂钩产品的设计、定价和避险原理
- 华为存储服务器lun丢失数据恢复方案