Java使用quartz实现作业调度
来源:互联网 发布:淘宝小店推广 编辑:程序博客网 时间:2024/06/05 15:05
在spring boot中使用quartz实现作业调度的功能,简单易用。
什么是Quartz?
Quartz是Java领域最著名的、功能丰富的、开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成——从小的单机应用到大的电子商务系统。 Quartz可以用来执行成百上千甚至数万的级别的、简单或者复杂的作业调度,一个Job可以执行任意的你所编程的任务。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
Quartz的主要角色有:
- Job:被调度的任务,重写其中execute方法,每次调度时会执行该方法;
- JobDetail:一个Job的具体化,可以这么看,JobDetail = Job + JobData
- Scheduler:调度器
- SchedulerFactory:调度工厂
- 各种ScheduleBuilder:CronScheduleBuilder(支持cron表达式的调度器)、CalendarIntervalScheduleBuilder(支持时间间隔的调度器)、SimpleScheduleBuilder(最简单的触发器,可以设置间隔,重复次数)
- Trigger:触发器,用于定义任务调度和时间规则,可以这么看,Trigger = ScheduleBuilder + Time
每个JobDetail都可以被唯一标识且指定一个抽象的Job,每个Trigger也都可以被唯一标识,Scheduler将JobDetail和Trigger绑定在了一起,即当trigger发生时,会调用JobDetail对应的Job的execute方法。
初始化一个调度器,需要JobDetail和Trigger:
scheduler.scheduleJob(jobDetail, trigger);scheduler.start();
初始化一个JobDetail:
this.jobDetail = newJob(SnapshotPolicyJob.class) .withIdentity(snapshotPolicyEntity.getId() + "-snapshot", snapshotPolicyEntity.getService()) .usingJobData("service", snapshotPolicyEntity.getService()) .usingJobData("directory", getDirectoryPrefix(snapshotPolicyEntity.getProject()) + snapshotPolicyEntity.getDirectory()) .build();//可以通过JobDetail给Job传参数,简单类型通过JobData传,复杂类型通过JobDataMap传:JobDataMap jobDataMap = this.jobDetail.getJobDataMap();jobDataMap.put("snapshotPolicyEntity", snapshotPolicyEntity);jobDataMap.put("snapshotHistoryRepository", snapshotHistoryRepository);jobDataMap.put("snapshotPolicyRepository", snapshotPolicyRepository);jobDataMap.put("configuration", configuration);
每一个JobDetail对应了一个Job:
public class SnapshotPolicyJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // ... }}
初始化一个Trigger,需要调度规则:
this.trigger = newTrigger() .withIdentity(snapshotPolicyEntity.getName(), snapshotPolicyEntity.getService()) .startAt(BackupUtils.now()) .withSchedule(cronBuilder) .build();
初始化一个调度规则:
cronExp = "0 " + minute + " " + hour + " " + day + " * ?";cronBuilder = CronScheduleBuilder.cronSchedule(cronExp);
这样,调度流程就串了起来,在满足调度条件后,会执行调度任务的作业。
默认情况下,调度信息是保留在内存中的,可以通过配置将调度信息持久化到数据库中。
在Spring boot中如何使用Quartz?
在pom.xml添加依赖:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version></dependency>
之后就可以通过代码实现业务逻辑,这里需要注意的是:在Job内,不能使用spring的注入机制注入对象,必须通过JobDataMap的方式由JobDetail传给Job相应的复杂类型的对象。
什么是cron表达式?
CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式。
Quartz的cron表达式的格式十分类似于 UNIX的cron表达式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒)。
另一个与 UNIX的cron表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。如下图所示:
注意,从左到右依次是:
秒 分 时 日 月 周 年
其中第七个域(年)可以省略为空,即这样两个cron表达式是等效的:
六个域:0 3 * * * ?七个域:0 3 * * * ? *
比如:
按月调度:每月1号8点10分调度
0 10 8 1 * ?
按周调度:每周一8点10分调度
0 10 8 * * 1
注意:1-7 对应 SUN-SAT,即1是周日,7是周六
按日调度:每日8点10分调度
0 10 8 * * ?
按小时调度:每小时的第10分调度
0 10 * * * ?
- Java使用quartz实现作业调度
- 使用quartz实现作业调度
- 使用Quartz实现作业调度(一)
- 使用Quartz实现作业调度(二)
- quartz 实现作业调度
- Jfinal+quartz实现作业调度
- Quartz.NET 实现作业调度
- 用Quartz实现作业调度
- Jfinal+quartz实现作业调度
- Quartz.NET实现作业调度
- Quartz:java作业调度框架
- java作业调度框架Quartz
- java作业调度框架Quartz
- spring 使用xml配置文件实现quartz作业调度
- Timer, Quartz 和 Spring 实现作业调度
- Timer, Quartz 和 Spring 实现作业调度
- Spring联姻Quartz实现作业调度
- Spring+Quartz 实现自动作业调度
- 实现一个简单Socket通信示例
- Spark Streaming源码解读之RDD生成全生命周期详解
- 第11周补充(3)点派生时间类
- iOS 蓝牙开发(二)iOS 连接外设的代码实现
- 镜花水月,过不留痕————铭记那些给我们带来进步的C语言小难题<2>
- Java使用quartz实现作业调度
- java中的Clone(深拷贝,浅拷贝)
- Kmp 模板(邝斌 - 人一我百,人百我万)
- iOS远程推送
- imfilter()函数的用法
- 网络流二十四题之十二 —— 软件补丁问题(BUG)
- min3d用法
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- Flume event转化为ES的document过程分析