您现在的位置是: 首页 > 车型测评 车型测评
quartz表达式_1
2024-10-26 17:54:14 51人已围观
简介quartz表达式 好久不见了各位,今天我想跟大家探讨一下关于“quartz表达式”的问题。如果你还不了解这方面的内容,那么这篇文章就是为你准备的,请跟我一起来探索一下。1.详细讲解Quartz如何从入门到精通2.Quartz怎么设置多任务3.用java的Quartz包定时调用方法,我想实现每隔
好久不见了各位,今天我想跟大家探讨一下关于“quartz表达式”的问题。如果你还不了解这方面的内容,那么这篇文章就是为你准备的,请跟我一起来探索一下。
1.详细讲解Quartz如何从入门到精通
2.Quartz怎么设置多任务
3.用java的Quartz包定时调用方法,我想实现每隔一个半小时调用一次方法, 请问Corn表达式怎么写?
4.Spring+quartz 做定时任务时,每5分种执行一次,怎么写法
5.quartz Cron表达式 每周执行一次要怎样写
6.在spring 中使用Quartz实现定时器 时间配置有问题
详细讲解Quartz如何从入门到精通
Quartz是一个开源的作业调度框架 它完全由Java写成 并设计用于J SE和J EE应用中 它提供了巨大的灵活性而不牺牲简单性 你能够用它来为执行一个作业而创建简单的或复杂的调度 它有很多特征 如 数据库支持 集群 插件 EJB作业预构建 JavaMail及其它 支持cron like表达式等等你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上 或许仅仅每个月的最后一天执行 一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误 应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用Java编程吗?如果这些问题中任何一个你回答是 那么你应该使用Quartz调度器
旁注 Matrix目前就大量使用到了Quartz 比如 排名统计功能的实现 在Jmatrix里通过Quartz定义了一个定时调度作业 在每天凌晨一点 作业开始工作 重新统计大家的Karma和排名等 还有 RSS文件的生成 也是通过Quartz定义作业 每隔半个小时生成一次RSS XML文件
Quartz让作业调度简单
Quartz是一个完全由Java编写的开源作业调度框架 不要让作业调度这个术语吓着你 尽管Quartz框架整合了许多额外功能 但就其简易形式看 你会发现它易用得简直让人受不了! 简单地创建一个实现 quartz Job接口的Java类 Job接口包含唯一的方法
在你的Job接口实现类里面 添加一些逻辑到execute()方法 一旦你配置好Job实现类并设定好调度时间表 Quartz将密切注意剩余时间 当调度程序确定该是通知你的作业的时候 Quartz框架将调用你Job实现类(作业类)上的execute()方法并允许做它该做的事情 无需报告任何东西给调度器或调用任何特定的东西 仅仅执行任务和结束任务即可 如果配置你的作业在随后再次被调用 Quartz框架将在恰当的时间再次调用它
如果你使用了其它流行的开源框架象struts 你会对Quartz的设计和部件感到舒适 虽然两个开源工程是解决完全不同的问题 还是有很多相似的之处 就是开源软件用户每天感觉很舒适 Quartz能用在单机J SE应用中 作为一个RMI服务器 也可以用在web应用中 甚至也可以用在J EE应用服务器中
Quartz的发展史
尽管Quartz今年开始受到人们注意 但还是暂时流行 Quartz由James House创建并最初于 年春天被加入sourcefe工程 接下来的几年里 有许多新特征和版本出现 但是直到项目迁移到新的站点并成为OpenSymphony项目家族的一员 才开始真正启动并受到应有的关注
James House仍然和几个协助他的业余开发者参与大量开发工作 Quartz开发团队今年能发布几个新版本 包括当前正处在候选发布阶段的 版
上手Quartz
Quartz工程驻留在OpenSymphony站点上 在Quartz站点上可以找到许多有用的资源 JavaDocs 包含指南的文档 CVS访问 用户和开发者论坛的连接 当然也有下载
从下载连接取得Quartz的发布版本 并且解压到到本地目录 这个下载文件包含了一个预先构建好的Quartz二进制文件(quartz jar) 你可以将它放进自己的应用中 Quartz框架只需要少数的第三方库 并且这些三方库是必需的 你很可能已经在使用这些库了
你要把Quartz的安装目录的/lib/core 和 /lib/optional目录中的第三方库加进你自己的工程中 大多数第三方库是我们所熟知和喜欢的标准Jakarta Commons库 像Commons Logging Commons BeantUtils等等
quartz properties文件
Quartz有一个叫做quartz properties的配置文件 它允许你修改框架运行时环境 缺省是使用Quartz jar里面的quartz properties文件 当然 你应该创建一个quartz properties文件的副本并且把它放入你工程的classes目录中以便类装载器找到它
一旦将Quartz jar文件和第三方库加到自己的工程里面并且quartz properties文件在工程的classes目录中 就可以创建作业了 然而 在做这之前 我们暂且回避一下先简短讨论一下Quartz架构
Quartz内部架构
在规模方面 Quartz跟大多数开源框架类似 大约有 个Java类和接口 并被组织到 个包中 这可以和Apache Struts把大约 个类和接口以及组织到 个包中相比 尽管规模几乎不会用来作为衡量框架质量的一个特性 但这里的关键是quarts内含很多功能 这些功能和特性集是否成为 或者应该成为评判一个开源或非开源框架质量的因素
Quartz调度器
Quartz框架的核心是调度器 调度器负责管理Quartz应用运行时环境 调度器不是靠自己做所有的工作 而是依赖框架内一些非常重要的部件 Quartz不仅仅是线程和线程管理 为确保可伸缩性 Quartz采用了基于多线程的架构
启动时 框架初始化一套worker线程 这套线程被调度器用来执行预定的作业 这就是Quartz怎样能并发运行多个作业的原理 Quartz依赖一套松耦合的线程池管理部件来管理线程环境 本文中 我们会多次提到线程池管理 但Quartz里面的每个对象是可配置的或者是可定制的 所以 例如 如果你想要 *** 自己线程池管理设施 我猜你一定能!
作业
用Quartz的行话讲 作业是一个执行任务的简单Java类 任务可以是任何Java代码 只需你实现 quartz Job接口并且在出现严重错误情况下抛出JobExecutionException异常即可
Job接口包含唯一的一个方法execute() 作业从这里开始执行 一旦实现了Job接口和execute()方法 当Quartz确定该是作业运行的时候 它将调用你的作业 Execute()方法内就完全是你要做的事情 下面有一些你要在作业里面做事情的例子
· 用JavaMail(或者用其他的像Commons Net一样的邮件框架)发送邮件
· 创建远程接口并且调用在EJB上的方法
· 获取Hibernate Session 查询和更新关系数据库里的数据
· 使用OSWorkflow并且从作业调用一个工作流
· 使用FTP和到处移动文件
· 调用Ant构建脚本开始预定构建
这种可能性是无穷的 正事这种无限可能性使得框架功能如此强大 Quartz给你提供了一个机制来建立具有不同粒度的 可重复的调度表 于是 你只需创建一个Java类 这个类被调用而执行任务
作业管理和存储
作业一旦被调度 调度器需要记住并且跟踪作业和它们的执行次数 如果你的作业是 分钟后或每 秒调用 这不是很有用 事实上 作业执行需要非常准确和即时调用在被调度作业上的execute()方法 Quartz通过一个称之为作业存储(JobStore)的概念来做作业存储和管理
有效作业存储
Quartz提供两种基本作业存储类型 第一种类型叫做RAMJobStore 它利用通常的内存来持久化调度程序信息 这种作业存储类型最容易配置 构造和运行 对许多应用来说 这种作业存储已经足够了
然而 因为调度程序信息是存储在被分配给JVM的内存里面 所以 当应用程序停止运行时 所有调度信息将被丢失 如果你需要在重新启动之间持久化调度信息 则将需要第二种类型的作业存储
第二种类型的作业存储实际上提供两种不同的实现 但两种实现一般都称为JDBC作业存储 两种JDBC作业存储都需要JDBC驱动程序和后台数据库来持久化调度程序信息 这两种类型的不同在于你是否想要控制数据库事务或这释放控制给应用服务器例如BEA s WebLogic或Jboss (这类似于J EE领域中 Bean管理的事务和和容器管理事务之间的区别)这两种JDBC作业存储是
· JobStoreTX 当你想要控制事务或工作在非应用服务器环境中是使用
· JobStoreCMT 当你工作在应用服务器环境中和想要容器控制事务时使用
JDBC作业存储为需要调度程序维护调度信息的用户而设计
作业和触发器
Quartz设计者做了一个设计选择来从调度分离开作业 Quartz中的触发器用来告诉调度程序作业什么时候触发 框架提供了一把触发器类型 但两个最常用的是SimpleTrigger和CronTrigger SimpleTrigger为需要简单打火调度而设计
典型地 如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业 那么SimpleTrigger适合你 另一方面 如果你有许多复杂的作业调度 那么或许需要CronTrigger
CronTrigger是基于Calendar like调度的 当你需要在除星期六和星期天外的每天上午 点半执行作业时 那么应该使用CronTrigger 正如它的名字所暗示的那样 CronTrigger是基于Unix克隆表达式的
作为一个例子 下面的Quartz克隆表达式将在星期一到星期五的每天上午 点 分执行一个作业
? * MON FRI
下面的表达式
? * L
将在 年到 年的每个月的最后一个星期五上午 点 分执行作业 你不可能用SimpleTrigger来做这些事情 你可以用两者之中的任何一个 但哪个跟合适则取决于你的调度需要
调度一个作业
让我们通过看一个例子来进入实际讨论 现假定你管理一个部门 无论何时候客户在它的FTP服务器上存储一个文件 都得用电子邮件通知它 我们的作业将用FTP登陆到远程服务器并下载所有找到的文件
然后 它将发送一封含有找到和下载的文件数量的电子邮件 这个作业很容易就帮助人们整天从手工执行这个任务中解脱出来 甚至连晚上都无须考虑 我们可以设置作业循环不断地每 秒检查一次 而且工作在 × 模式下 这就是Quartz框架完全的用途
首先创建一个Job类 将执行FTP和Email逻辑 下例展示了Quartz的Job类 它实现了 quartz Job接口
我们故意让ScanFTPSiteJob保持很简单 我们为这个例子创建了一个叫做JobUtil的实用类 它不是Quartz的组成部分 但对构建各种作业能重用的实用程序库来说是有意义的 我们可以轻易将那种代码组织进作业类中 quarts 调度器一样好用 因为我们一直在使用quarts 所以那些代码可继续重用
JobUtil checkForFiles() and JobUtil sendEmail()方法使用的参数是Quartz创建的JobDataMap的实例 实例为每个作业的执行而创建 它是向作业类传递配置参数的方法
这里并没有展示JobUtil的实现 但我们能用Jakarta上的Commons Net轻易地实现FTP和Email功能
用调度器调用作业
首先创建一个作业 但为使作业能被调度器调用 你得向调度程序说明你的作业的调用时间和频率 这个事情由与作业相关的触发器来完成 因为我们仅仅对大约每 秒循环调用作业感兴趣 所以打算使用SimpleTrigger
作业和触发器通过Quartz调度器接口而被调度 我们需要从调度器工厂类取得一个调度器的实例 最容易的办法是调用StdSchedulerFactory这个类上的静态方法getDefaultScheduler()
使用Quartz框架 你需要调用start()方法来启动调度器 例 的代码遵循了大多数Quartz应用的一般模式 创建一个或多个作业 创建和设置触发器 用调度器调度作业和触发器 启动调度器
编程调度同声明性调度
我们通过编程的方法调度我们的ScanFTPSiteJob作业 就是说 我们用Java代码来设置作业和触发器 Quartz框架也支持在xml文件里面申明性的设置作业调度 申明性方法允许我们更快速地修改哪个作业什么时候被执行
Quartz框架有一个插件 这个插件负责读取xml配置文件 xml配置文件包含了关于启动Quartz应用的作业和触发器信息 所有xml文件中的作业连同相关的触发器都被加进调度器 你仍然需要编写作业类 但配置那些作业类的调度器则非常动态化 你可以将xml文件中的元素跟例 代码作个比较 它们从概念上来看是相同的 使用申明性方法的好处是维护变得极其简单 只需改变xml配置文件和重新启动Quartz应用即可 无须修改代码 无须重新编译 无须重新部署
有状态和无状态作业
在本文中你所看到的作业到是无状态的 这意味着在两次作业执行之间 不会去维护作业执行时JobDataMap的状态改变 如果你需要能增 删 改JobDataMap的值 而且能让作业在下次执行时能看到这个状态改变 则需要用Quartz有状态作业
如果你是一个有经验的EJB开发者的话 深信你会立即退缩 因为有状态带有负面含义 这主要是由于EJB带来的伸缩性问题 Quartz有状态作业实现了 quartz StatefulJob接口
无状态和有状态作业的关键不同是有状态作业在每次执行时只有一个实例 大多数情况下 有状态的作业不回带来大的问题 然而 如果你有一个需要频繁执行的作业或者需要很长时间才能完成的作业 那么有状态作业可能给你带来伸缩性问题
Quartz框架的其他特征
Quartz框架有一个丰富的特征集 事实上 quarts有太多特性以致不能在一种情况中全部领会 下面列出了一些有意思的特征 但没时间在此详细讨论
监听器和插件
每个人都喜欢监听和插件 今天 几乎下载任何开源框架 你必定会发现支持这两个概念 监听是你创建的Java类 当关键事件发生时会收到框架的回调 例如 当一个作业被调度 没有调度或触发器终止和不再打火时 这些都可以通过设置来来通知你的监听器 Quartz框架包含了调度器监听 作业和触发器监听 你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听
一旦你的一个具体监听被调用 你就能使用这个技术来做一些你想要在监听类里面做的事情 例如 你如果想要在每次作业完成时发送一个电子邮件 你可以将这个逻辑写进作业里面 也可以JobListener里面 写进JobListener的方式强制使用松耦合有利于设计上做到更好
Quartz插件是一个新的功能特性 无须修改Quartz源码便可被创建和添加进Quartz框架 他为想要扩展Quartz框架又没有时间提交改变给Quartz开发团队和等待新版本的开发人员而设计 如果你熟悉Struts插件的话 那么完全可以理解Quartz插件的使用
与其Quartz提供一个不能满足你需要的有限扩展点 还不如通过使用插件来拥有可修整的扩展点
集群Quartz应用
Quartz应用能被集群 是水平集群还是垂直集群取决于你自己的需要 集群提供以下好处
· 伸缩性
· 搞可用性
· 负载均衡
目前 Quartz只能借助关系数据库和JDBC作业存储支持集群 将来的版本这个制约将消失并且用RAMJobStore集群将是可能的而且将不需要数据库的支持
Quartz web应用
使用框架几个星期或几个月后 Quartz用户所显示的需求之一是需要集成Quartz到图形用户界面中 目前Quartz框架已经有一些工具允许你使用Java servlet来初始化和启动Quartz 一旦你可以访问调度器实例 你就可以把它存储在web容器的servlet上下文中(ServletContext中)并且可以通过调度器接口管理调度环境
幸运的是一些开发者已正影响着单机Quartz web应用 它用来更好地管理调度器环境 构建在若干个流行开源框架如Struts和Spring之上的图形用户界面支持很多功能 这些功能都被包装进一个简单接口
Quartz的下一步计划
Quartz是一个活动中的工程 Quartz开发团队明确表示不会停留在已有的荣誉上 Quartz下一个主要版本已经在启动中 你可以在OpenSymphony的 wiki上体验一下Quartz 的设计和特征 总之 Quartz用户每天都自由地添加特性建议和设计创意以便能被核心框架考虑(看重)
了解更多Quartz特征
lishixinzhi/Article/program/Java/ky/201311/27892Quartz怎么设置多任务
public?static?void
main(String[]?args)?{
try
{
Scheduler
scheduler?=?StdSchedulerFactory.getDefaultScheduler();
scheduler.start();?
JobDetail
jd?=?new?JobDetail("test",?"test_group",?testJob.class);
CronTrigger
ct?=?new?CronTrigger("test",?"test_group");
//你修改下面的?表达式?就能满足了
//时间格式:?<!--?s?m?h?d?m?w(?)?y(?)?-->,分别对应:?秒>分>小时>日>月>周>年
ct.setCronExpression("0/5?*?*?*?*?");
scheduler.scheduleJob(jd,ct);
//System.out.println("Scheduler?started?at?"?+?new?Date());?
}
catch?(SchedulerException?e)?{
//TODO?Auto-generated?catch?block
e.printStackTrace();
}
catch?(ParseException?e)?{
//TODO?Auto-generated?catch?block
e.printStackTrace();
}?
}
用java的Quartz包定时调用方法,我想实现每隔一个半小时调用一次方法, 请问Corn表达式怎么写?
用quartz实现多任务动态加载
Hudson报表系统二期结束了,这次新增了邮件定制功能,实现此功能的核心在于quartz框架。
Quartz是什么
Quartz是一个用Java编写的任务调度框架,任务调度是什么,举例说明:比如我们需要在每个星期四下午三点时候发周报,我们需要一个系统在两点半的 时候给我们一个发周报的提醒,这个提醒就是一次任务,每周星期四下午两点半的时候自动触发这个任务,这就可以理解为这个系统的一次任务调度。Quartz 提供给我们定时调度已定义好的任务的能力,如果你了解quartz的调度计划cronExpression表达式的配置,你会感叹quartz的灵活与强 大。
Quartz的应用广泛,对于Hudson报表系统,恰好为邮件定制功能提供强有力的支持。
Quartz的简单使用
在Hudson报表系统的一期中也用到了quartz,不过当时是把任务调度信息写死在配置文件中,每次系统启动后,调度的配置都加载在内存中,没有实现 多任务的动态加载。我们先以此来说明quartz的基本用法。Hudson报表系统是用spring框架将quartz整合起来的,故只介绍spring 和quartz的整合使用。
下图为spring配置文件中quartz的配置:
其实quartz的使用主要有三个部分,一个调度器Scheduler,一个要被调度的任务JobDetail,一个触发器Trigger,对上面的配置做一说明,在图中从下到上:
1、 配置一个job,这个job就是我们要调度的任务类,
2、 配置jobDetail,jobDetail需要加载job实现类,并且指定目标方法即完成任务需要执行的方法为execute,在这个方法里面定义我们要做的任务,execute方法需要我们在job类中实现。
3、 配置trigger,用于触发我们定义的任务,在触发器的配置中,我们需要加载需要调度的任务jobDetail,当然还要配置好我们需要触发的时间,触 发的时间配置在cronExperssion表达式中,这个表达式非常灵活与强大,举个例子:我们需要每个工作日早八点到晚八点之间,每半个小时触发一次 任务,我们可以将表达式配置为:0 0/30 8-20 ? * MON-FRI。这个表达式的详细解释可以登录Hudson报表系统(链接:http://10.232.29.21:8080/hudson-report/),点击邮件信息维护里面的“邮件发送时间计划配置帮助”查看。
4、 配置scheduler,只需要加载trigger即可,可以在list标签下配置多个trigger。注意,scheduler的配置中有个lazy- init=false的配置,这表明只要我们的spring一启动,quartz的scheduler也跟着启动,否则其值为true的话,会因为惰性加 载的问题,导致quartz不起作用,此项默认值是false。
至此,我们的配置写好了,只需要实现拥有execute方法的job类就可以了。
这种方法也可以实现多任务调度,具体做法为:我们每新增一个调度,就需要在配置文件中多加这个调度相关的配置,这样显然很麻烦。
Quartz的多任务动态加载
先做简要说明:
多个任务的动态加载是指:在当前的scheduler中已经有可触发的任务的情况下,我们需要新增一条任务进去,并且使得新增的任务也立即加载到 scheduler中,等待触发。要实现这样的功能,上面的方法明显不能达到,而且我们需要使得我们的任务状态持久化,即每次重启quartz后,自动加 载重启前拥有的任务,把任务保存于内存也明显不能达到此目的。怎么办?添加数据库支持,将信息保存于数据表中。
Quartz的官方文档中提供了在各种类型数据库中建立数据表的sql文件(/docs/dbTables目录下),我们采用MySQL数据库可以选择 tables_mysql_innodb.sql这个文件。这里需要注意的是编码,quartz默认采用latin1编码,我们一般用urf-8或者 gbk编码,建立表的时候会提示表中存在过长的字段,怎么办,改编码?但我们需要中文字符,所以我们可以将过长的字段长度改为支持的长度即可,现阶段并没 有发现副作用。
建立起来的数据表如下图:
共十二张表,从上到下依次解释:
qrtz_blob_triggers:
qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。
qrtz_cron_triggers:存放cron类型的触发器
qrtz_fired_triggers:存放已触发的触发器
qrtz_job_details:存放一个jobDetail信息
qrtz_job_listeners:job监听器
qrtz_locks:
qrtz_paused_trigger_graps:存放暂停掉的触发器
qrtz_scheduler_state:调度器状态
qrtz_simple_triggers:简单触发器的信息
qrtz_trigger_listeners:触发器监听器
qrtz_triggers:触发器的基本信息
Quartz的触发时间的配置有三种方式:
cron的方式:采用cronExpression表达式配置时间;
simple的方式,和JavaTimer差不多,可以指定一个开始时间和结束时间外加一个循环时间;
calendars方式,可以和cron配合使用,用cron表达式指定一个触发时间规律,用calendar指定一个范围。
我们采用的是cron方式,需要用到的数据表主要是:qrtz_triggers ,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details。
到这里开始讲到底怎么来实现我们的多任务动态加载。
其实我们要实现我们的多任务动态调度根本不需要了解这些表,我们要做的只是实现一个做任务的job类,然后新建一个jobDetail,设置参数,新建一个trigger,设置参数,一起加入到scheduler里面去就行了。具体过程如下:
1、 建立数据表,配置好数据库连接。
2、 在Spring的配置文件中配置好schedule:
其中dataSource配置的是数据库连接,threadCount配置的是容许同时5个任务触发,
startupDelay配置的是触发启动后的时延,这些配置的具体信息大家可以阅读quartz的官方帮助文档来了解。
3、 建立一个用于提供schedule服务的接口ScheduleService及其实现类ScheduleServiceImpl,
这里提供scheduleJob的方法作为示例,以我们的邮件任务为例,我们直接传入一条邮件记录对象,这个对象拥有id,name,收件人,抄送人,主题,还要有一个cronExpression表达式用于定时发送,看具体实现:
在上面的方法中,我们要新增一条邮件任务的时候,拿到这个邮件信息对象,先新建一个JobDetail对象,设置参数,setName方法可以给 jobDetail对象指定一个名字,我们希望一条邮件信息对象对应一个jobDetail,故把邮件信息对象的id传入,否则假如两次新增任务时 jobDetail的名字一样,那么后者会覆盖前者的数据,使得前者失效。JopDataMap里面可以保存我们需要传入的业务参数,邮件信息的参数就保 存在邮件信息对象里面,所以我们把整个对象传入,最重要的是setJobClass这个方法,设置了要处理我们任务的类,使得任务触发后quartz知道 去哪里执行任务。最后将此任务加入scheduler。
然后新建一个CronTrigger对象,构造对象的时候就传入trigger自己的名字和所在组,jobDetail的名字和所在组,设置好 cronExpression表达式,这样此trigger就会按此表达式的计划做触发。需要说明的是:一个jobDetail可以对应多个 trigger,只要在构造时设置trigger名字不同,而jobDetail的名字相同,就可以为相同的jobDetail建立不同的trigger 触发器。而且对于trigger也可以设置jobDataMap,保存此触发器触发时需要的业务参数。
最后SchedulerJob方法把trigger加入scheduler,等待触发。
Spring+quartz 做定时任务时,每5分种执行一次,怎么写法
结合spring框架写的
<bean?id="cronTriggerPay"?
class="org.springframework.scheduling.quartz.CronTriggerBean"> <property?name="jobDetail"> <!--?使用嵌套Bean的方式来定义任务Bean?--> <bean? class="org.springframework.scheduling.quartz.JobDetailBean"> <!--?指定任务Bean的实现类?--><property?name="jobClass"
value="org.seu.yto.schedule.PayJob"/>
<!--?为任务Bean注入属性?-->
<property?name="jobDataAsMap">
<map>
<entry?key="empMgr"?value-ref="empManager"/></map>
</property>
</bean> </property> <!--?指定Cron表达式:每月1日6点启动?--> <property?name="cronExpression"?value="0?0?6?1?**"/></bean>
<!--?定义触发器来管理任务Bean?-->
<bean?id="cronTriggerPunch"?
class="org.springframework.scheduling.quartz.CronTriggerBean"> <property?name="jobDetail"> <!--?使用嵌套Bean的方式来定义任务Bean?--> <bean class="org.springframework.scheduling.quartz.JobDetailBean"><!--?指定任务Bean的实现类?-->
<property?name="jobClass"?
value="org.seu.yto.schedule.PunchJob"/>
<!--?为任务Bean注入属性?-->
<property?name="jobDataAsMap">
<map>
<entry?key="empMgr"?value-ref="empManager"/></map>
</property>
</bean> </property> <!--?指定Cron表达式:周一到周五8点、12点执行调度?--> <property?name="cronExpression"? value="0?0?8,12*?MON-FRI"/></bean>
<!--?执行实际的调度调度?-->
<bean?
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property?name="triggers"> <list><ref?local="cronTriggerPay"/>
<ref?local="cronTriggerPunch"/>
</list> </property></bean>
quartz Cron表达式 每周执行一次要怎样写
可以使用cron表达式写,* 5 * * * * *。以下为cron表达式详解:
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
每一个域可出现的字符如下:
Seconds:可出现", - * /"四个字符,有效范围为0-59的整数
Minutes:可出现", - * /"四个字符,有效范围为0-59的整数
Hours:可出现", - * /"四个字符,有效范围为0-23的整数
DayofMonth:可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
Month:可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek:可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year:可出现", - * /"四个字符,有效范围为1970-2099年
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1)*:表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
(3)-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
(4)/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
(5),:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
举几个例子:
0 0 2 1 * ? * 表示在每月的1日的凌晨2点调度任务
0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
年份(1970-2099)
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"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触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“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 , - * /
在spring 中使用Quartz实现定时器 时间配置有问题
既然是每小时这种固定间隔的执行,大可以用simpleTrigger,没必要用cronTrigger了。如果用cronTrigger,写表达式的时候写上分钟的数值就可,表示每小时的多少分执行:0 1 * * * ? 每小时第1分钟时执行一次
可以了吗楼主可以补充下具体情况吗
quarts表达式,每天10:00:00触发就是
"0 0 10 * * ? *" 不行的话试试其他的吧楼主
Expression
Meaning
"0 0 12 * * ?"
Fire at 12pm (noon) every day
"0 15 10 ? * *"
Fire at 10:15am every day
"0 15 10 * * ?"
Fire at 10:15am every day
"0 15 10 * * ? *"
Fire at 10:15am every day
"0 15 10 * * ? 2005"
Fire at 10:15am every day during the year 2005
"0 * 14 * * ?"
Fire every minute starting at 2pm and ending at 2:59pm, every day
"0 0/5 14 * * ?"
Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day
"0 0/5 14,18 * * ?"
Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day
"0 0-5 14 * * ?"
Fire every minute starting at 2pm and ending at 2:05pm, every day
"0 10,44 14 ? 3 WED"
Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.
"0 15 10 ? * MON-FRI"
Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday
"0 15 10 15 * ?"
Fire at 10:15am on the 15th day of every month
"0 15 10 L * ?"
Fire at 10:15am on the last day of every month
"0 15 10 ? * 6L"
Fire at 10:15am on the last Friday of every month
"0 15 10 ? * 6L"
Fire at 10:15am on the last Friday of every month
"0 15 10 ? * 6L 2002-2005"
Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005
"0 15 10 ? * 6#3"
Fire at 10:15am on the third Friday of every month
今天关于“quartz表达式”的讨论就到这里了。希望通过今天的讲解,您能对这个主题有更深入的理解。如果您有任何问题或需要进一步的信息,请随时告诉我。我将竭诚为您服务。