Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。

quartz核心概念

Job:是一个接口,表示一个工作,要执行的具体内容。只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中;

JobDetail:JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触发机制的基础上使用Calendar进行定点排除。

Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

Quartz的工作原理:

1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。

2、JobDetail是一个可执行的工作,它本身可能是有状态的。

3、Trigger代表一个调度参数的配置,什么时候去调。

4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。

5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。

总结起来就是,Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例。

Quartz的两大触发器

Quartz有两大触发器,SimpleTrigger和CronTrigger。当且仅需触发一次或者以固定时间间隔周期触发执行时使用SimpleTrigger触发器,需要定时调度任务时使用CronTrigger

SimpleTrigger:当需要在规定的时间执行一次或在规定的时间段以一定的时间间隔重复触发执行Job时,SimpleTrigger就可以满足要求;SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔,重复次数属性的值可以为0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY,重复的时间间隔属性值必须为0或长整型的正整数,以毫秒作为时间单位,当重复的时 间间隔为0时,意味着与Trigger同时触发执行(或几乎与Scheduler开始时同时触发执行)。如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的 Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性 值即可(我们也可以指定一个比在指定结束时间到达时实际执行次数大的重复次数)。

CronTrigger:支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔。Cron表达式Cron Expression参看本人以下博客:http://blog.csdn.net/lmb55/article/details/51013044

两种调度方式的简单使用:

TestQuartzJob.java

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date; /** * 一个简单的任务,say hello word */
public class TestQuartzJob implements Job { public TestQuartzJob() { } public void execute(JobExecutionContext context)throws JobExecutionException { System.out.println("Hello World! - " + new Date());}
}

TestQuartzScheduling.java

import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.simpleproxy.Quartz.TestQuartzJob;public class TestQuartzScheduling {/*** 使用SimpleTrigger间隔调度任务* @throws Exception*/public void simpleRun() throws Exception { //1、创建JobDetial对象 JobDetail jobDetail = new JobDetail(); //设置工作项 jobDetail.setJobClass(TestQuartzJob.class); jobDetail.setName("MyJob_1"); jobDetail.setGroup("JobGroup_1");
//        JobDetail jobDetail = new JobDetail("MyJob_1","JobGroup_1",TestQuartzJob.class); //2、创建Trigger对象 SimpleTriggerSimpleTrigger strigger = new SimpleTrigger(); strigger.setName("Trigger_1"); strigger.setGroup("Trigger_Group_1"); strigger.setStartTime(new Date()); //设置重复停止时间,并销毁该Trigger对象 java.util.Calendar c = java.util.Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis() + 1000 * 1L); strigger.setEndTime(c.getTime()); strigger.setFireInstanceId("Trigger_1_id_001"); //设置重复间隔时间
//        strigger.setRepeatInterval(100 * 1L);
//        strigger.setRepeatInterval(500 * 1L);strigger.setRepeatInterval(1000 * 1L); //设置重复执行次数 strigger.setRepeatCount(3); //3、创建Scheduler对象,并配置JobDetail和Trigger对象 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = null; try { scheduler = sf.getScheduler(); scheduler.scheduleJob(jobDetail, strigger); //4、并执行启动、关闭等操作 scheduler.start();
//                scheduler.shutdown(true); //关闭调度器 } catch (SchedulerException e) { e.printStackTrace(); } } /*** 使用CronTrigger定时调度任务* @throws Exception* @author Administrator* @date 2017-9-6*/public void cronRun() throws Exception { //创建Scheduler对象,并配置JobDetail和Trigger对象 SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();//创建JobDetial对象 JobDetail jobDetail = new JobDetail("testQuartzJob",Scheduler.DEFAULT_GROUP, TestQuartzJob.class);String cronExpression = "30/5 * * * * ?"; // 每分钟的30s起,每5s触发任务        //创建Trigger对象CronTriggerCronTrigger cronTrigger = new CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP, cronExpression);scheduler.scheduleJob(jobDetail, cronTrigger);scheduler.start();} public static void main(String[] args) throws Exception { TestQuartzScheduling example = new TestQuartzScheduling(); example.simpleRun();example.cronRun();}}

运行结果:

在使用SimpleTrigger间隔调度任务的时候,我设置了几个不同的重复间隔时间,运行得到了不同的结果。

注意:本文示例使用的Quartz版本是1.8.6。

稍后本人会根据源码,来学习一下Quartz的原理,有兴趣的同学,可以先参看下面的几篇分析文章:

Quartz原理解析:
http://blog.csdn.net/guolong1983811/article/details/51501346
http://lavasoft.blog.51cto.com/62575/181907/

【定时任务】Quartz用法详解相关推荐

  1. linux下crontab命令的用法,linux 定时任务crontab用法详解

    linux 定时任务crontab用法详解 linux中crontab命令用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读 ...

  2. linux定时任务的用法详解

    crontab的基本格式: f1 f2 f3 f4 f5 command 分 时 日 月 周 命令 第一列f1代表分钟1~59:当f1为表示每分钟都要执行:为/n表示每n分钟执行一次:为a-b表示从第 ...

  3. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  4. Quartz.Net详解

    Quartz.Net详解 代码仓库地址 Gitee:https://gitee.com/bluecusliyou Github:https://github.com/bluecusliyou 零.文章 ...

  5. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  6. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  7. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  8. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  9. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

最新文章

  1. ((void *) 0)的含义和void的一些细节
  2. URL编码表%20Base64编码表%20HTTP消息含义
  3. JSP学习笔记(一):JSP语法和指令
  4. 在EXT中向弹窗传值或者对象
  5. Python学习笔记之类型判断,异常处理,终止程序操作小结
  6. 关于 Angular 应用 tsconfig.json 中的 lib 属性
  7. ruby 变量类中范围_Ruby中的类
  8. 历史上今天和成语辞典 进入美国区教育类 what's hot
  9. 华为Mate 40工程机曝光:并未采用屏下摄像头
  10. 【转】fatal error C1010: unexpected end of file解决方案
  11. Microsoft 错误报告发送修复补丁通用版
  12. java Hashtable 和 HashiMap 的区别
  13. android listview优化,Android ListView 详解及其优化
  14. exchange创建邮箱组_在 Exchange 2016 中创建用户邮箱
  15. 在arm64上基于qemu的vhost user blk设备hotplug
  16. MSP430(CCS工程下)添加printf实现打印功能
  17. 基于STM32单片机智能RFID刷卡汽车位锁设计(开题报告)
  18. 纳人才,谋发展 | 人大金仓喜获“最佳雇主校招案例奖”
  19. python dataframe删除重复行_2.3.10 DataFrame 查看删除重复项
  20. 精选——Hive十道面试题(下)

热门文章

  1. PostgreSQL在何处处理 sql查询之六
  2. A Windows Mobile GPS Application Sample – Using Fake GPS
  3. IIS中WEB服务器的日志存放到SQL Server 2005中
  4. Redis中7种集合类型应用场景
  5. android 监听手机电量变化
  6. android studio 快速删除无用的import包
  7. Chrome Native Client 原理
  8. URI和URLConnection类的区别
  9. Bundle/Intent传递序列化参数暗藏杀机
  10. 操作系统页面置换算法