【2018-2019】quartz配置日志-word范文 (23页)

【2018-2019】quartz配置日志-word范文 (23页)
【2018-2019】quartz配置日志-word范文 (23页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!

== 本文为word格式,下载后可方便编辑和修改! ==

quartz配置日志

篇一:Quartz学习笔记

Quartz技术学习笔记

Quartz特点

1) Quartz能嵌入到任何独立的应用中运行。

2) Quartz能在应用服务器或者 Servlet 容器中实例化,并且能够参与 XA 事务。

3) Quartz能够以独立的方式运行(在它自己的Java虚拟机中),可以通过RMI使用 Quartz。

4) Quartz可以被实例化为独立程序的集群(有负载均衡和容错能力)。

Quartz功能介绍

任务执行(Job Execution)

1) 任务是任何实现简单 Job 接口的 Java 类,这样开发者能够执行任何完成他们工作的任务。

2) 任务类的实例可以由 Quartz实例化,也可以由你的程序框架实例化。

当触发器被触发时,日程管理器将会通知某个或者多个实现了JobListener 或TriggerListener的对象(监听器可以是简单的Java对象,或者 EJBs,或者JMS 消息发布器,等等)。这些监听器在任务执行完毕后也会接到通知。

3) 任务被完成后,他们会返回一个“任务完成码(JobCompletionCode)”,这个“任务完成码”告知日程管理器任务执行的结果是成功还是失败。日程管理器会根据成功或者失败码来采取措施,比如:立即重新执行任务

任务持久化(Job Persistence)

1) Quartz设计中包括了一个JobStore接口,这样,实现这个接口的 Job多种机制实现Job 的存储。

2) 存储在数据库中:通过使用 JDBCJobStore,所有的 Jobs和 Triggers 被配置为“non-volatile”(不

轻快)的方式。即,通过 JDBC 存储在关系数据库中。

3) 存储在RAM中:通过使用 RAMJobStore,所有Jobs和 Triggers 被存储在RAM。因此,在程序执行中没有被持久化,但这种方式的优点就是不需要外部数据库。事务(Transactions)

1) Quartz通过JobStoreCMT(JDBCJobStore的一个子类)可参与 JTA 事务。

2) Quartz可以管理JTA (工作任务分析)事务(开始或者提交事务)。

集群(Clustering)

1) Fail-over.(容错)

2) Load balancing.(负载均衡)

监听器及插件(Listeners & Plug-Ins)

1) 应用可以通过实现一个或者多个监听器接口来实现捕捉日程事件,以监视或控制任务/触发器的行为。

2) 可以通过插件的机制来扩展 Quartz 的功能。例如:记录任务执行历史的日志,或者从文件中载入任务和触发器的定义。

3) Quartz自带了一些“factory built(内建)”的插件和监听器。

什么是Quartz

Quartz是一个任务日程管理系统,这个系统可以与任何其他软件系统集成或者一起用。“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

Quartz相当“轻量”,并且需要非常少的步骤/配置,如果需求比较基本,Quartz确实非常容易使用。

Quartz具有容错性,并且可以在你系统重起的时候持久化(记住)被纳入日程的任务。 Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有 Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

如果你想将软件组件的执行纳入到日程中,它们只需简单地实现 Job 接口,这个接口有一个 execute()方法。如果希望在日程安排的时间到达时通知组件,

那么这些组件应实现 TriggerListener或者 JobListener接口。

Quartz主过程可以在应用中启动或者运行,也可以作为一个独立的应用(带有RMI<远程服务接口>接口),或者在一个J2EE 应用服务器中运行,并且可作为

其它 J2EE组件的一种引用资源。

Quartz与java.util.Timer(JDK1.3起)的区别

1.Java 定时器没有持久化机制。

2.Java 定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置

特定的日期、时间等)

3.Java 定时器没有使用线程池(每个Java 定时器使用一个线程)

4.Java 定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任

务的措施。夏令时和触发器

SimpleTrigger 总是每隔若干毫秒触发,而同夏令时没有关系。

CronTrigger 总是在给定的时间触发,然后计算它下次触发的时间。

开始使用Quartz

Job:接口:只有一个方法:oid execute(JobExecutionContext context)。

JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不

直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现

类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,

JobDetail承担了这一角色。

通过该类的构造函数可以更具体地了解它的功用:

JobDetail(https://www.360docs.net/doc/9815118785.html,ng.String name, https://www.360docs.net/doc/9815118785.html,ng.String group,

https://www.360docs.net/doc/9815118785.html,ng.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;

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关联,以便

排除或包含某些时间点。

Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注

册到Scheduler中,两者在 Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为

它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名

称访问和控制容器中Trigger和JobDetail。

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实例。ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过

共享线程池中的线程提高运行效率。

Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法

的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。无状态任务在执行时拥有自己的JobDataMap拷贝,对JobDataMap的更改不会

影响下次的执行。而有状态任务共享共享同一个 JobDataMap实例,每次任务

执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,也即每次执行任务后都会对后面的执行发生影响。

如果Quartz使用了数据库持久化任务调度信息,无状态的JobDataMap仅会在Scheduler注册任务时保持一次,而有状态任务对应的JobDataMap在每次执行

任务后都会进行保存。

Trigger自身也可以拥有一个JobDataMap,其关联的Job可以通过JobExecutionContext#getTrigger().getJobDataMap()获取Trigger中的JobDataMap。不管是有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMap所做的更改都不会进行持久,也即不会对下次的执行产生影响。

监听体系:Quartz拥有完善的事件和监听体系,大部分组件都拥有事件,如任

务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开

始事件、关闭事件等等,可以注册相应的监听器处理感兴趣的事件。

quartz定时任务时间设置

quartz定时任务时间设置 这些星号由左到右按顺序代表:* * * * * * * 格式:[秒] [分] [小时] [日] [月] [周] [年] 序号说明 是否必填允许填写的值允许的通配符 1 秒是0-59 , - * / 2 分是0-59 , - * / 3 小时是0-23 , - * / 4 日是1-31 , - * ? / L W 5 月是1-12 or JAN-DEC , - * / 6 周是1- 7 or SUN-SAT , - * ? / L # 7 年否empty 或1970-2099 , - * / 通配符说明: * 表示所有值. 例如:在分的字段上设置"*",表示每一分钟都会触发。 ? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为0 0 0 10 * ? - 表示区间。例如在小时上设置"10-12",表示10,11,12点都会触发。 , 表示指定多个值,例如在周字段上设置"MON,WED,FRI" 表示周一,周三和周五触发 / 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。 L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五" W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为"1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-"). 小提示 'L'和'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资) # 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) 小提示 周字段的设置,若使用英文字母是不区分大小写的MON 与mon相同. 常用示例: 0 0 12 * * ? 每天12点触发 0 15 10 ? * * 每天10点15分触发 0 15 10 * * ? 每天10点15分触发 0 15 10 * * ? * 每天10点15分触发 0 15 10 * * ? 2005 2005年每天10点15分触发 0 * 14 * * ? 每天下午的2点到2点59分每分触发

Quartz时间规则表达式

Quartz表达式 “*”字符代表所有可能的值 因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟 在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?” “L”字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写但是它在两个子表达式里的含义是不同的。 在天(月)子表达式中,“L”表示一个月的最后一天 在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT 如果在“L”前有具体的内容,它就具有其他的含义了 例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题 字段允许值允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可选)留空, 1970-2099 , - * / 表达式意义 "0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *" 每天上午10:15触发 "0 15 10 * * ?" 每天上午10:15触发 "0 15 10 * * ? *" 每天上午10:15触发 "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 "0 15 10 15 * ?" 每月15日上午10:15触发 "0 15 10 L * ?" 每月最后一日的上午10:15触发 "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 ================================================================ =============== 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数)

详细讲解Quartz如何从入门到精通

详细讲解Quartz如何从入门到精通(1) Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE 和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。 本文内容 1、Quartz让任务调度简单 2、Quartz的发展史 3、上手Quartz 4、Quartz内部架构 5、作业 6、作业管理和存储 7、有效作业存储 8、作业和触发器 9、调度一个作业 10、用调度器(Scheduler)调用你的作业 11、编程调度同声明性调度 12、有状态和无状态作业 13、Quartz框架的其他特征 14、Quartz下一步计划 15、了解更多Quartz特征 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用 Java编

程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。 旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix 里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。 还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML 文件。 所以Quartz使用的地方很多,本文无疑是一篇很好的入门和进阶的文章,在此,感谢David w Johnson的努力! Quartz让作业调度简单 在你的Job接口实现类里面,添加一些逻辑到execute()方法。一旦你配置好Job 实现类并设定好调度时间表,Quartz将密切注意剩余时间。当调度程序确定该是通知你的作业的时候,Quartz框架将调用你Job实现类(作业类)上的 execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用任何特定的东西。仅仅执行任务和结束任务即可。如果配置你的作业在随后再次被调用,Quartz框架将在恰当的时间再次调用它。 如果你使用了其它流行的开源框架象struts,你会对Quartz的设计和部件感到舒适。虽然两个开源工程是解决完全不同的问题,还是有很多相似的之处,就是开源软件用户每天感觉很舒适。Quartz能用在单机J2SE应用中,作为一个RMI服务器,也可以用在web应用中,甚至也可以用在J2EE应用服务器中。 Quartz的发展史 尽管Quartz今年开始受到人们注意,但还是暂时流行。Quartz由James House 创建并最初于2001年春天被加入sourceforge工程。接下来的几年里,有许多新特征和版本出现,但是直到项目迁移到新的站点并成为 OpenSymphony项目家族的一员,才开始真正启动并受到应有的关注。 James House仍然和几个协助他的业余开发者参与大量开发工作。Quartz开发团队今年能发布几个新版本,包括当前正处在候选发布阶段的1.5版。 上手Quartz Quartz工程驻留在OpenSymphony站点上。在Quartz站点上可以找到许多有用的资源:JavaDocs,包含指南的文档,CVS访问,用户和开发者论坛的连接,当然也有下载。 从下载连接取得Quartz的发布版本,并且解压到到本地目录。这个下载文件包含了一个预先构建好的Quartz二进制文件(quartz.jar),你可以将它放进自己的应

quartz定时格式配置

一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下: -------------------------------------------------------------------------------- 字段名允许的值允许的特殊字符 -------------------------------------------------------------------------------- 秒0-59 , - * / 分0-59 , - * / 小时0-23 , - * / 日1-31 , - * ? / L W C 月1-12 or JAN-DEC , - * / 周几1-7 or SUN-SAT , - * ? / L C # 年(可选字段) empty, 1970-2099 , - * / -------------------------------------------------------------------------------- 写时从左到右分别表示秒分时日月周年 '*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。 '?' 字符可以用在“日”和“周几”字段. 它用来指定'不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。 '-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点". ',' 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday". '/' 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和45秒"。而"5/15"则表示"第5, 20, 35, 和50". 在'/'前加"*"字符相当于指定从0秒开始.每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。 'L'字符可用在“日”和“周几”这两个字段。它是"last"的缩写, 但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天" ——对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" ——比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。 'W'字符可用于“日”字段。用来指定离给定日期最近的工作日(周一到周五)。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。 'L'和'W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"。 '#' 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" = 表示该月第一个周一而"4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。 'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历, 那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"。 对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

Quartz+spring定时器实例用

Spring+Quartz定时器例子如下: 1. javabean类 在Test.QuartzJob中 1.package Test; 2. 3.public class QuartzJob { 4.public void work() 5. { 6. System.out.println("Quartz的任务调度!!!"); 7. } 8. } 1. 2. 7. 8. 9. 10. 11. 13. 14. 15. 16. 17. 18. 19.work 20. 21. 22. 23. 25. 26.

quartz时间配置说明

Quartz时间配置说明 一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下: 字段名允许的值允许的特殊字符 秒0-59 , - * / 分0-59 , - * / 小时0-23 , - * / 日1-31 , - * ? / L W C 月1-12 or JAN-DEC , - * / 周几1-7 or SUN-SAT , - * ? / L C # 年(可选字段) empty, 1970-2099 , - * / ------------------------------------------------------------------------------------------------------ * 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。 ? 字符可以用在“日”和“周几”字段. 它用来指定'不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。 _ 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点". , 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday". / 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和45秒"。而"5/15"则表示"第5, 20, 35, 和50". 在'/'前加"*"字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。 L 字符可用在“日”和“周几”这两个字段。它是"last"的缩写, 但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天" ——对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示"7" or "SA T",但是如果在“周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" ——比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。 W 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五) 。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

Quartz任务调度说明 CronTrigger + Spring

触发器中两个重要的触发器 1,SimpleTrigger :可以精确到毫秒,如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行 例如: public SimpleTrigger(String name, //名称 String group, //组名 Date startTime, //开始时间 Date endTime, //结束时间(控制权高于重复次数属性)为null 时直到永远 int repeatCount, //重复次数(可能是0) long repeatInterval) //重复间隔(以毫秒为单位) 2,CronTrigger :像日历那样按日程来触发任务。可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。 也可以像SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续. Cron表达式被用来配置CronTrigger实例.Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:秒分钟小时月中的天天周中的天年 秒---例如:3/5从第3秒开始每隔5秒触发一次 通配符('*')可以被用来表示域中“每个”可能的值 '?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。 'L'字符可以在day-of-month及day-of-week中使用,L是last的缩写。如时在day-of-month 中L表示的月的最后一天。在day-of-week中,表示"当月的最后的周XXX",例如:"6L" 或者"FRIL"都表示本月的最后一个周五。 '#'表示表示月中的第几个周几。例如:day-of-week 域中的"6#3" 或者"FRI#3" 表示“月中第三个周五”。 注意:对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。 这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。 CronTrigger 例1 –一个简单的每隔5分钟触发一次的表达式 "0 0/5 * * * ?" CronTrigger 例2 –在每分钟的10秒后每隔5分钟触发一次的表达式(例如. 10:00:10 am, 10:05:10等.)。 "10 0/5 * * * ?" CronTrigger 例3 –在每个周三和周五的10:30,11:30,12:30触发的表达式。 "0 30 10-13 ? * WED,FRI" CronTrigger 例4 –在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:30,9:00和9:30的表达式。

quartz corn参数配置 复杂表达式

Quartz中时间参数说明即Cron表达式 Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 表1 Cron表达式时间字段 Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”; ●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符; ●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12; ●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五; ●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y; ●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L 用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五; ●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围; ●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日; ●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发; ● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。 Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。 表2下面给出一些完整的Cron表示式的实例: 表2 Cron表示式示例 表示式 说明

Quartz Cron 表达式(时间格式的写法)

Quartz Cron 表达式(时间格式的写法) Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。 在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上。Quartz 用 cron 表达式存放执行计划。引用了 cron 表达式的 CronTrigger 在计划的时间里会与job 关联上。 另一个与UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。表 5.1 列出了 Quartz cron 表达式支持的七个域。 名称是否必须允许值特殊字符 秒是0-59, -* / 分是0-59, -* / 时是0-23, -* / 日是1-31, -* ? / L W C 月是1-12 或 JAN-DEC, -* / 周是1-7 或 SUN-SAT, -* ? / L C # 年否空 或 1970-2099, -* / 月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。 域之间有空格分隔,这和 UNIX cron 一样。无可争辩的,我们能写的最简单的表达式看起来就是这个了: * * * ? * * 这个表达会每秒钟(每分种的、每小时的、每天的)激发一个部署的 job。 ?理解特殊字符 同 UNIX cron 一样,Quartz cron 表达式支持用特殊字符来创建更为复杂的执行计划。然而,Quartz 在特殊字符的支持上比标准 UNIX cron 表达式更丰富了。 * 星号 使用星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个trigger。 表达式样例: 0 * 17 * * ? 意义:每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值17 在小时域上,在下午 6 点时,小时变为18 了,也就不再理会这个trigger,直到下一天的下午5点。 在你希望 trigger 在该域的所有有效值上被激发时使用 * 字符。 ? 问号 ? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。 不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。 只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个?。 表达式样例: 0 10,44 14 ? 3 WEB 意义:在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。 , 逗号 逗号(,) 是用来在给某个域上指定一个值列表的。例如,使用值0,15,30,45 在秒域上意味着每15秒触发一个trigger。 表达式样例: 0 0,15,30,45 * * * ? 意义:每刻钟触发一次 trigger。 / 斜杠 斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样0/15。 表达式样例: 0/15 0/30 * * * ? 意义:在整点和半点时每15秒触发trigger。 -中划线 中划线(-) 用于指定一个范围。例如,在小时域上的 3-8 意味着"3,4,5,6,7 和 8 点。" 域的值不允许回卷,所以像 50-10 这样的值是不允许的。 表达式样例: 0 45 3-8 ? * * 意义:在上午的3点至上午的8点的45分时触发trigger。 L 字母 L 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。例如,当月域上指定了 JAN 时,在日域上的 L 会促使 trigger 在1月31号被触发。假如月域上是 SEP,那么L 会预示着在9月30号触发。换句话说,就是不管指定了哪个月,都是在相应月份的时最后一天触发trigger。 表达式 0 0 8 L * ? 意义是在每个月最后一天的上午 8:00 触发trigger。在月域上的 * 说明是 "每个月"。 当L 字母用于周域上,指示着周的最后一天,就是星期六 (或者数字7)。所以如果你需要在每个月的最后一个星期六下午的 11:59 触发trigger,你可以用这样的表达式 0 59 23 ? * L。 当使用于周域上,你可以用一个数字与L 连起来表示月份的最后一个星期 X。例如,表达式 0 0 12 ? * 2L 说的是在每个月的最后一个星期一触发trigger。

Quartz开发指南

定时器(Quartz)使用说明 本文目前主要包括如下几个部分: Quartz功能简介:介绍Quartz的特点及概念。 使用Quartz的常见问题:很多用户在使用过程中遇到常见问题的解答。 快速开始:让读者尽快掌握Quartz开发。 Quartz官方开发指南:通过一些列的课程来指导如何使用Quartz. Quartz功能简介 Quartz特点: z Quartz能嵌入到任何独立的应用中运行。 z Quartz能在应用服务器或者Servlet容器中实例化,并且能够参与XA事务。 z Quartz能够以独立的方式运行(在它自己的Java虚拟机中),可以通过RMI使用Quartz。 z Quartz可以被实例化为独立程序的集群(有负载均衡和容错能力)。 Job Scheduling(任务日程安排) 任务在给定的触发器(Trigger)触发时执行。触发器可以通过几乎以下所有形式的组合方式进行创建: z在一天中的任意时刻(可以精确到毫秒)。 z一周中特定的一些天。 z一个月中特定的一些天。 z一年中特定的一些天 z不在日历列表中注册的一些天(比如节假日)。 z循环特定的次数。 z循环到特定的时间。 z无限循环。 z按照一定的时间间隔循环。 “任务”由创建者给定名字,并且可以加入到给定名称的“任务组”中。为了简化触

发器在日程中的管理,“触发器”也可以被给定名字和分组。任务只能加入到日程中一次,但是可以为其注册多个触发器。在J2EE环境中,任务可以作为分布(XA)事务的一部分执行。 Job Execution(任务执行) ?任务是任何实现简单Job接口的Java 类,这样开发者能够执行任何完成他们工作的任务。 ?任务类的实例可以由Quartz实例化,也可以由你的程序框架实例化。 当触发器被触发时,日程管理器将会通知某个或者多个实现了JobListener 或TriggerListener的对象(监听器可以是简单的Java对象,或者EJBs,或者JMS消息发布器,等等)。这些监听器在任务执行完毕后也会接到通知。 ?任务被完成后,他们会返回一个“任务完成码(JobCompletionCode)”,这个“任务完成码”告知日程管理器任务执行的结果是成功还是失败。日程管理器会根据成功或者失败码来采取措施,比如:立即重新执行任务。 Job Persistence(任务持久化) ?Quartz设计中包括了一个JobStore接口,这样,实现这个接口的Job类可以以多种机制实现Job的存储。 ?通过使用JDBCJobStore,所有的Jobs和Triggers被配置为“non-volatile”(不轻快)的方式。即,通过JDBC存储在关系数据库中。 ?通过使用RAMJobStore,所有Jobs和Triggers被存储在RAM。因此,在程序执行中没有被持久化,但这种方式的优点就是不需要外部数据库。 Transactions(事务) ?Quartz通过JobStoreCMT(JDBCJobStore的一个子类)可参与JTA事务。 ?Quartz可以管理JTA事务(开始或者提交事务)。 Clustering(集群) ?Fail-over.(容错) ?Load balancing.(负载均衡) Listeners & Plug-Ins(监听器及插件) ?应用可以通过实现一个或者多个监听器接口来实现捕捉日程事件,以监视或控制任务/触发器的行为。 ?可以通过插件的机制来扩展Quartz 的功能。例如:记录任务执行历史的日志,或者从文件中载入任务和触发器的定义。

Quartz处理定时任务的核心概念

核心概念 1.Job:Job是任务执行的流程,是一个类 2.JobDetail:JobDetail是Job是实例,是一个对象,包含了该实例的执行计划和所需要的数据 3.Trigger:Trigger是定时器,决定任务何时执行 4.Scheduler:调度器,调度器接受一组JobDetail+Trigger即可安排一个任务,其中一个JobDetail可以关联多个Trigger 实例 1.初始化: 1 2 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); 当程序退出时,应该主动调用shutdown()方法关闭该调度器。 2.Job: 一个Job类需要实现org.quartz.Job接口,这个接口值需要实现一个方法即可:

1 void execute(JobExecutionContext context) throws JobExecutionException context是重要的上下文,可以访问到关联的JobDetail对象和本次触发的Trigger对象,以及在此之上设定的数据。 3.JobDetail: 可以使用JobBuilder来构建一个JobDetail对象: 1 2 3 4 5 6 7 JobDetail job = JobBuilder.newJob(MyJob.class) // MyJob是我实现的Job类 .withIdentity("myjob") // 可以给该JobDetail起一个id,便于之后的检索 .requestRecovery() // 执行中应用发生故障,需要重新执行 .storeDurably() // 即使没有Trigger关联时,也不需要删除该JobDetail .usingJobData("key1", "value1") .usingJobData("key2", "value2") // 以Key-Value形式关联数据 .build(); Quartz因为考虑到有些任务不是幂等的,不可以多次重复执行,所以默认没有开启“requestRecovery”。当确认业务中允许一次任务执行两次的情况下,可以开启该选项,则任务肯定不会因为应用停止而漏调用,但缺点就是,有可能会重复调用。 每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中,可以通过context取出该数据,进行业务流程处理。 4.Trigger:

quartz_jobs.xml参数的配置

https://www.360docs.net/doc/9815118785.html,/lizhi3000/blog/item/0fd9eb3441dbdeb0d0a2d39a.html 最近集成用到了Quartz 需求 1.能够在接口平台实现任务调度 2.能够通过命令在接口平台添加修改任务 3.能够查看目前的任务 Quartz 和流程的关系 可在Quartz 配置触发流程的动作 在 quartz.properties 中有两个重要的属性正是满足你的需求的,如下配置用 JobInitializtionPlugin 插件的片断: .............................. #================================================================ ============ # Configure Plugins #================================================================ ============ org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin org.quartz.plugin.jobInitializer.fileName = quartz_jobs.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 5 org.quartz.plugin.jobInitializer.overWriteExistingJobs = true 最后面那两个属性,scanInterval 设置重复扫描 quartz_job.xml 文件(默认的job配置文件名)的间隔,单位为秒(默认为0,表示不自动加载),发现配置有新的 jobDetail 则加载到调度器中执行,如 overWriteExistingJobs 配置为 false(默认为 false),则碰到新的 quartz_job.xml 文件中有与现有调度器中同名的 jobDetail 则不覆盖,这就会出现,只改了job 的 cron 表达式而不能重新生效的情况;把 overWriteExistingJobs 设置为 true,就可以避免出现这种情况,可随时修改 job.xml 动态调整执行计划。 写一个通用的执行命令的类 类的参数为命令

Spring集成Quartz定时任务框架介绍和Cron表达式详解

在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。 我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。 使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。 一、增加所依赖的JAR包 1、增加Spring的Maven依赖 org.springframework spring-webmvc 3.0.5.RELEASE 2、增加Quartz的Maven依赖 org.quartz-scheduler quartz 1.8.4 二、增加定时业务逻辑类 publicclass ExpireJobTask { /** Logger */ privatestaticfinal Logger logger = LoggerFactory.getLogger(ExpireJobTask.class); /** * 业务逻辑处理 */ publicvoid doBiz() { // 执行业务逻辑 // ........

Quartz任务调度--详细教程

Quartz任务调度快速入门1 概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务。 对于一个典型的MIS系统来说,在每月1号凌晨统计上个月各部门的业务数据生成月报表,每半个小时查询用户是否已经有快到期的待处理业务……,这样的例子俯拾皆是,不胜枚举。 任务调度本身涉及到多线程并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。如果直接使用自定义线程这种刀耕火种的原始办法,开发任务调度程序是一项颇具挑战性的工作。Java开源的好处就是:领域问题都能找到现成的解决方案。 OpenSymphony所提供的Quartz自2001年发布版本以来已经被众多项目作为任务调度的解决方案,Quartz在提供巨大灵活性的同时并未牺牲其简单性,它所提供的强大功能使你可以应付绝大多数的调度需求。 Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。 此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述: ●Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中; ●JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail 承担了这一角色。

相关文档
最新文档