一、Quartz的介绍

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。它是一个而安全有java辨析额的开源作业调度框架。

二、Quartz 具有以下特点

1.强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;

2.灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;

3.分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升;

4.另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

开发企业级任务调度应用:Quartz就是启动定时任务的框架!!!

三、基本开发流程及简单实例

利用 Quartz 进行开发相当简单,只需要将下载开发包中的 quartz-all-1.8.4.jar 加入到 classpath 即可。根据笔者的经验,对于任务调度功能比较复杂的企业级应用来说,最好在开发阶段将 Quartz 的源代码导入到开发环境中来。一方面可以通过阅读源码了解 Quartz 的实现机理,另一方面可以通过扩展或修改 Quartz 的一些类来实现某些 Quartz 尚不提供的功能。

1.Quartz定时调度框架使用说明

1) Job任务

具体要执行任务的程序。比如发短信,发邮件,访问数据库,同步数据,数据的清洗,本项目中使用在宣传活动定时过期的模块。

2)Trigger触发器

a)作用:它是来执行工作任务,在什么条件下触发,什么时间执行,多久执行一次。

b)四大类型:SimpleTrigger,CronTirgger,DateIntervalTrigger, 和 NthIncludedDayTrigger。

SimpleTrigger 一般用于实现每隔一定时间执行任务,以及重复多少次,如每 2 小时执行一次,重复执行 5 次。SimpleTrigger 内部实现机制是通过计算间隔时间来计算下次的执行时间,这就导致其不适合调度定时的任务。例如我们想每天的 1:00AM 执行任务,如果使用 SimpleTrigger 的话间隔时间就是一天。注意这里就会有一个问题,即当有 misfired 的任务并且恢复执行时,该执行时间是随机的(取决于何时执行 misfired 的任务,例如某天的 3:00PM)。这会导致之后每天的执行时间都会变成 3:00PM,而不是我们原来期望的 1:00AM。

CronTirgger 类似于 LINUX 上的任务调度命令 crontab,即利用一个包含 7 个字段的表达式来表示时间调度方式。例如,"0 15 10 * * ? *" 表示每天的 10:15AM 执行任务。对于涉及到星期和月份的调度,CronTirgger 是最适合的,甚至某些情况下是唯一选择。例如,"0 10 14 ? 3 WED" 表示三月份的每个星期三的下午 14:10PM 执行任务。读者可以在具体用到该 trigger 时再详细了解每个字段的含义。

3)scheduler定时器

Scheduler就是用来启动Trigger去执行Job。

在 Quartz 中, Scheduler 由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二种工厂 StdSchedulerFactory 使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。

2.简单案例

【使用步骤】:

1.导入quartz和quartz-job 的jar包

2.定义job任务类,该任务类需要实现接口Job,并重写方法

3.创建定时器对象

StdSchedulerFactory.getDefaultSchedule()获得的是一个定时器Scheduler对象

4.创建一个工作(jobDetail)对象实例,设置它的名字、组(当trigger去触发job的时候,是按照名字和分组去进行触发的)

a.JobBuilder.newJob(HelloJob.class) //创建builder,(jobDetail的预准备对象)

b.通过builder调用withIdentity()去设置builder的名字和分组

c.最后通过build()方法获得一个jobDetail对象

5.定义一个触发器trigger对象,用来执行jobDetail

a.TriggerBuilder.newTrigger() //创建一个触发器trigger对象,

b.withIdentity(“trigger_1”, “group_1”) //设置触发器的名字和分组

c.startNow() //设置触发器开始执行JobDetail的起始时间,还有startAt() 在指定的时间去执行

//设置以哪种方式执行JobDetail

[有两种方式]

一种是:SimpleScheduleBuilder 简单任务的重复执行

另一种是:CronTrigger 按日历触发任务

//以及执行一次JobDetail的间隔时间,以及执行到什么时候

d.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))

e.build() 最终获得一个Trigger对象

6.开启定时任务

scheduler.start();

【CronTrigger 按日历触发任务 简介】

[Cron表达式]:

由7个子表达式组成的字符串,每个子表达式都描述了一个单独的日程细节,这些子表达式用空格分割,分别表示:1.Seconds 秒2.Minutes 分3.Hours 小时4.Day-of-Month 月中的天,可选值(1-31)5.Month 哪一个月,可选值(JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC)6.Day-of-Week 周中的天,可选值(SUN、MON、TUE、WED、THU、FRI、SAT)7.Year 年(可选的域,可有可无)

[特殊字符]'/'用来表示增量'?' 用来表示没有执行的值,但是,4、6不能同时使用'?'它们必须指定一项 否则会报错'*'通配符,表示所有可能的值

[Cron表达式示例]:0 0 12 ? * WED -------表示每周三的中午12:00

0/15如果放在第一位,表示从0开始,每15分钟执行一次

【使用案例一】:

【使用案例1】:

[创建job类,使用SimpleSchedulerBuilder]:importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;//quartz的任务

public class HelloJob implementsJob {public static int i = 0;public void execute(JobExecutionContext context) throwsJobExecutionException {

System.out.println("hello quartz............"+(i++));

}

}

[测试类]:importorg.junit.Test;importorg.quartz.JobBuilder;importorg.quartz.JobDetail;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.SimpleScheduleBuilder;importorg.quartz.Trigger;importorg.quartz.TriggerBuilder;importorg.quartz.impl.StdSchedulerFactory;importjob.HelloJob;//在测试的时候遇到一个问题,如果使用JUnit来进行测试的话,进程会死掉

public classHelloScheduler {public static void main(String[] args) throwsSchedulerException {//创建一个定时器对象

Scheduler scheduler =StdSchedulerFactory.getDefaultScheduler();//定义一个工作对象

JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job_1","group1").build();//定义触发器

Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_1", "group_1")

.startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();

scheduler.scheduleJob(jobDetail, trigger);//开启定时任务

scheduler.start();

}

}

【使用案例二】:

【使用案例2】:

[创建job类,使用CronSchedulerBuilder]:importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;public class SecondJob implementsJob{public void execute(JobExecutionContext context) throwsJobExecutionException {

System.out.println("使用crontrigger....");

}

}

[创建测试类]:importorg.quartz.CronScheduleBuilder;importorg.quartz.JobBuilder;importorg.quartz.JobDetail;importorg.quartz.Scheduler;importorg.quartz.Trigger;importorg.quartz.TriggerBuilder;importorg.quartz.impl.StdSchedulerFactory;importjob.SecondJob;public classSecondScheduler {public static void main(String[] args) throwsException {//创建一个定时器对象

Scheduler scheduler =StdSchedulerFactory.getDefaultScheduler();//创建一个jobDetail对象

JobDetail jobDetail = JobBuilder.newJob(SecondJob.class).withIdentity("job_2", "group_2").build();//创建一trigger

Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_2", "group_2")

.startNow().withSchedule(CronScheduleBuilder.cronSchedule("0 17 1 * * ?")).build();

scheduler.scheduleJob(jobDetail,trigger);

scheduler.start();

}

}

通过以上案例,可以了解到quart的使用和简单入门操作。

当然,作为当前颇具生命力的开源框架,Quartz 已经得到了广泛的应用。Quartz 的强大功能和应用灵活性,在企业应用中发挥了巨大的作用。本文描述了如何应用 Quartz 开发应用程序,并对企业应用中常见的问题及解决方案进行了讨论。

定时器 java qua_Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )相关推荐

  1. Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )

    一.Quartz的介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 年被 Terracotta 收购,目前是 Ter ...

  2. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  3. java corn 定时任务调度,每分钟执行一次,每半个小时执行一次

    java corn 表达式 每分钟执行一次@Scheduled(cron = "0 */1 * * * ?")每半个小时执行一次@Scheduled(cron = "0 ...

  4. 【Java定时任务调度工具】Timer

    笔记来源:IMOOC Java Timer 定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. Timer 定义 一种工具,线程用其安排以后在后台线程中执行的任务.可安排 ...

  5. XML——流机制解析器

    [0]README 0.1) 本文文字描述转自 core java volume 2 , 旨在理解 XML--流机制解析器 的基础知识 : 0.2) for detailed StAX, please ...

  6. Java定时任务调度工具之Timer

    Java定时任务调度工具详解之Timer 导航: Java定时任务调度工具详解之Timer 一. 概述 1.1 课程介绍 1.2 Timer简介 1.3 实战演练 二. timer定时函数的用法 2. ...

  7. java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫...

    A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 , ...

  8. 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

    获取[下载地址]   QQ 313596790 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速 ...

  9. Java定时任务调度工具

    tags: 定时任务调度, title: Java定时任务调度工具 为什么要使用定时任务调度工具? 在最近的开发中,想开发一个"个人备忘录"的功能,实际上就是用户在指定某个时间点后 ...

  10. 全面解析Java的垃圾回收机制

    Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarray和mult ...

最新文章

  1. Tomcat的虚拟主机的配置
  2. jQuery-动画点击淡化消失
  3. Winserver-Exception from HRESULT: 0x800A03EC
  4. 使用单例模式加载properties文件
  5. ES6-使用 super 关键字访问原型对象
  6. 《『若水新闻』客户端开发教程》——13.代码编写(5)
  7. 虚拟化--051 vsphere linux搭建NTP服务器搭建
  8. cad插件_抖音最火CAD插件教程汇总
  9. CentOS 系统时间校准
  10. 三极管导通条件与电位关系
  11. RedHat8.0配置本地yum源
  12. [零刻]EQ12安装PVE虚拟机教程
  13. vanilla_使用Vanilla JavaScript构建Cookie库
  14. Python实现猜单词游戏
  15. poi 替换word里的\n 变成 换行
  16. 图书馆学专业学c语言吗,图书馆学专业介绍及考研院校排名
  17. DaoCloud丨云原生边缘计算产业发展现状与趋势展望
  18. 「解析」Self-Attention 关键点
  19. Word2vec-Tensorflow实战
  20. 动态规划练习题(3)开餐馆

热门文章

  1. 使用微软TTS语音引擎实现文本朗读
  2. 相见恨晚的5个资源网站 影视音乐资源随你看
  3. 手工清除U盘Survial病毒
  4. 传奇故事-领军AI的华裔女性-李飞飞
  5. 栈溢出 __stack_chk_fail
  6. 【Udacity】数据的差异性:值域、IQR、方差和标准差
  7. Python生成验证码图片及验证用户提交的验证码是否正确
  8. 遗传算法 神经网络 深度学习 概率论 模糊数学 之间有什么区别?
  9. 网上图书商城项目学习笔记-017结算,跳转结算页面
  10. Flutter 项目实战 截图分享到微信|QQ|微博 十二