quartz框架_定时任务调度框架Quartz
最近需要写一个每天定点自动执行的定时任务,对于以前自己写小项目,可能会选择java自带的Timer类,但是对于公司中的项目,Timer类实现定时任务只能有一个后台线程执行任务,并且只能让程序按照某个频度执行,并不能在指定时间点执行。同时由于一般大型项目会有多个job分别需要在不同的时间点自动执行,单线程的Timer满足不了需求。而任务调度框架Quartz刚好满足这些需求,我是实习公司的项目中就已经配置好了这个框架,在使用的时候了解了这个quartz,现总结如下。
2.quartz是什么?
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:持久性作业 - 就是保持调度定时的状态;作业管理 - 对调度作业进行有效的管理;
quartz主要包括三个部分的模块,定时任务Job、触发器Trigger、调度器Scheduler。
简单的流程就是:调度器根据触发器来执行任务。
2.1 Job
- Job:即被调度的任务,实现业务逻辑的接口,接口中只有一个方法execute。如果需要创建一个任务,必须得实现这个接口,任务每次被调用的时候都会执行这个execute方法的逻辑。
//预定义Job接口--pom.xml需要加载依赖的包public interface Job { void execute(JobExecutionContext var1) throws JobExecutionException;}//任务逻辑通过实现Job接口,并且重写execute方法,将需要执行的逻辑实现写在execute函数中public class TestJob implements Job { /**把要执行的操作,写在execute方法中 */ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("I can do something..."); System.out.println(sdf.format(new Date())); } } 参考:https://juejin.im/post/5a0c08c5f265da4335624c8f//1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法)JobDetail jobDetail = JobBuilder.newJob(QuartzOrderReturn.class)// 定义Job类为QuartzOrderReturn类,这是真正的执行逻辑所在 .withIdentity(StrUtils.uuid()) .setJobData(jobDataMap) .build();
2.2 Trigger
- trigger:触发器,用于定义任务调度的时间 规则。quartz有两种常见的trigger:SimpleTrigger和CornTrigger。
- SimpleTrigger 主要针对一些简单的时间触发进行配置使用,比如指定的时间开始然后在一定的时间间隔之内重复执行一个job,同时可以任意指定重复的次数,但是不适合每天定时执行任务的场景,比如SimpleTrigger解决不了需要每天半夜十二点执行的任务。
//创建SimpleTrigger startTime end 分别表示触发器的首次触发时间和不再被触发的时间 SimpleTrigger trigger = newTrigger() .withIdentity("trigger", "group") .startAt(startTime) .endAt(end) .withSchedule( simpleSchedule().withIntervalInHours( executeFrequency).withRepeatCount( executeBatch)).build();
- CronTrigger 可以配置更复杂的触发时刻表,基于日历的作业触发器。使用SimpleTrigger触发器需要设置不同的属性支撑,代码编写比较多,并且不灵活。而CornTrigger就比较灵活,可以通过设计Corn表达式来控制复杂的触发时间表。
- Corn表达式:用于配置CornTrigger实例,由7个表达式组成的字符串,描述了时间表的详细信息。
//创建CornTrigger 比如下面的就是设计每天中午十二点整触发CronTrigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule("0 0 12 * * ?")).build();// 把job和trigger加入调度scheduler.scheduleJob(jobDetail, trigger);//启动schedulerscheduler.start();
对于Corn的理解参考: https://mp.weixin.qq.com/s/-0kwxC2lzs3CQrRP5sWoKQ
在线生成Corn表达式: http://cron.qqe2.com/
2.3 Scheduler
- Scheduler:在每次调度器执行job时,它在调用execute方法前会创建一个新的job实例,当调用完成之后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
- Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。
// 把job和trigger加入调度scheduler.scheduleJob(jobDetail, trigger);//启动schedulerscheduler.start();
//一个完整的实例private void quartzOrderReturn(List returnIds) { try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("returnIds", returnIds); //1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法) JobDetail jobDetail = JobBuilder.newJob(QuartzOrderReturn.class)// 定义Job类为QuartzOrderReturn类,这是真正的执行逻辑所在 .withIdentity(StrUtils.uuid()) .setJobData(jobDataMap) .build(); // 2. 定义一个Trigger,定义该job在10秒后执行,并且执行一次 Date startTime = new Date(); startTime.setTime(startTime.getTime() + 10000L); SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(StrUtils.uuid(), HeaderNameConstants.getQuartzTrigger()).startNow()// 定义名字和组 .startAt(startTime) .withSchedule(SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2)//定义时间间隔是2秒 .withRepeatCount(0)//定义重复执行次数是无限次 ) .build(); // 4. 将trigger和jobdetail加入这个调度 scheduler.scheduleJob(jobDetail, trigger); // 5. 启动scheduler scheduler.start(); // 6. 任务执行后20秒后休眠 Thread.sleep(startTime.getTime() + 20000L); // 7. 如果定时任务开启则关闭 if (scheduler.isStarted()) { scheduler.shutdown(true); } } catch (SchedulerException | InterruptedException e) { e.printStackTrace(); } }
2.4 结构图
- IJob:预实现的Job接口
- MyJob:实现Job接口,定时任务逻辑写再execute函数
- JobDetail,顾名思义,就是表示关于每个Job的相关信息,它主要包括两个核心组件,即Job Task和JobData Map
- Trigger,表示触发器,根据配置规则来触发执行计划调度job,它主要包括两个核心组件,即SimpleTrigger和CronTrigger
- IJobStore,表述任务存储器,主要存储job和trigger相关信息。
- ISchedulerFactory,表示任务计划工厂,用来管理任务计划IScheduler。
- IScheduler,表述任务计划,它相当于一个容器,具体job和job相关trigger就能够被注入其中,从而实现任务计划调度。其主要常用的方法:Start --启动执行计划 Shutdowm --关闭执行计划
//每个2秒执行一次 string cronParam = "*/2 * * * * ?"; //创建计划任务抽象工厂 ISchedulerFactory sf = new StdSchedulerFactory(); //创建计划任务 IScheduler sched = sf.GetScheduler(); //创建job JobDetail job = new JobDetail("myJob","group", typeof(MyJob)); //创建触发器 Trigger trigger = new CronTrigger("myTrigger","group",cronParam); //将job和trigger注入到计划任务中 sched.ScheduleJob(job, trigger); //启动计划任务 sched.Start(); //关闭计划任务 //sched.Shutdown();
参考: https://www.cnblogs.com/wangjiming/archive/2018/11/28/10027439.html
3.定时任务如何实现并调度:TimeWheel
定时一般是使用时间轮(time wheel)算法实现。 时间轮算法简单来说可以用下图表示,其主体是一个循环列表,
新任务加入时,会根据目前指针所在位置和需要等待的时间,确定保存在时钟的哪个位置。时间轮有3个重要的属性参数,ticksPerWheel(一轮的tick数),tickDuration(一个tick的持续时间)以及 timeUnit(时间单位)。
例如 当ticksPerWheel=60,tickDuration=1,timeUnit=秒,这就和现实中秒针走动完全类似了,我们就用这种情况举例子。箭头运行到一个位置时,就运行相应的任务,然后通过sleep将时间补足一秒,正好就开始下一个tick了。这样循环往复,就可以让每个任务在需要的时间执行。
参考链接:
https://www.zhihu.com/question/41918492/answer/490367825
http://www.kafka.cc/archives/244.html
quartz框架_定时任务调度框架Quartz相关推荐
- 任务调度框架Quartz(一) Quartz——一个强大的定时任务调度框架
Quartz,水晶.石英,一个简单朴素有美丽的名字,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框架. 何为定时任务调 ...
- 分布式定时任务调度框架Quartz
文章目录 一.Quartz引言 二.Quartz使用 2.1 导入依赖 2.2 定义Job 2.3 API测试 2.3.1 细节 2.4 配置 2.5 核心类说明 三.Trigger触发器 3.1 S ...
- 定时任务调度框架实现总结
转自:http://www.blogchong.com/post/96.html 在应用里经常都有用到在后台跑定时任务的需求. 举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据 ...
- Quartz定时任务调度框架
一.引言 1.1 简介 Quartz :Quartz Enterprise Job Scheduler 是一个定时任务调度框架.比如你遇到这样的问题: 想在30分钟后,查看订单是否支付,未支付则取消订 ...
- Spring整合定时任务调度框架Quartz实
Spring整合定时任务调度框架Quartz实战 定时的任务处理在程序开发中应用的相当普遍,之前一直使用JDK的Timer类库来做任务调度功能不是很方便,因为它不能像cron服务那样可以指定具体年.月 ...
- TBSchedule淘宝开源定时任务调度框架(附客户端源码demo)
淘宝开源定时任务调度框架 下载TBSchedule源码svn地址:code.taobao.org/p/tbschedule/src/trunk/ 内容包括两部分:TBSchedule源码及开发依赖包t ...
- ElasticJob分布式定时任务调度框架以及生产遇到的问题
ElasticJob分布式定时任务调度框架 1:maven配置 2:客户端xml配置 3:测试类 4:重点: 5:总结 1:maven配置 <!--elastic-job--><de ...
- 一文揭秘定时任务调度框架quartz
之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...
- python分布式任务调度_分布式定时任务调度框架
1. 目标 把定时任务通过集群的方式进行管理调度,并采用分布式部署,保证系统的高可用,提高了容错.那么如何保证定时任务只在集群的某一个节点上执行,或者一个任务如何拆分为多个独立的任务项,由分布式的机器 ...
最新文章
- java定时关机源码_java实现电脑定时关机的方法
- 流程图在登录后会增加操作选项的方法
- CUDA占用率计算方法
- PHP中call user func()和call_user_func_array()调用自定义函数小结
- 七招挽回受损WORD文档
- js方式调用php_举例说明JS调用PHP和PHP调用JS的方法
- Spring Boot 单例模式中依赖注入问题
- 如何检测python是否安装_布同自制Python函数帮助查询小工具
- Python使用pdfminer3k提取PDF文件中的文本
- AndroidStudio安卓原生开发_Activity的启动模式standard和一部分singleTop启动模式---Android原生开发工作笔记86
- picker从后台取数据
- MCU总线读写仿真模块
- 使用keeplive处理socket网络异常断开
- java基础app开发教程_安卓app开发基础入门
- SONiC vs testbed搭建
- SovitChart工具1分钟快速开发前端统计图表
- android输入法横向,Android 手机拼音输入法横向全评
- Detectron2的使用指南
- [HEOI2013] 钙铁锌硒维生素
- 使用 H3C 的办公室路由器和 IDC 的防火墙建立 IPSec ***
热门文章
- mysql8.0root连接失败_mac 下jdbc连接mysql 8.0 失败
- PAT乙级(1034 有理数四则运算)
- java面试 设计模式_Java面试中常问到的设计模式
- Hadoop中mapreduce作业日志是如何生成的
- 5月20日,GaussDB将有大事发生
- 技术实践丨PostgreSQL插件之pg_dirtyread “闪回查询“
- 带你揭开IP地址的神秘身份
- 详解智能建筑消防预警系统设计与实现
- 发布一个网页智能解析算法库
- 【华为云技术分享】Linux内核模块依赖图绘制(2)