如何用Quartz实现如下的调度呢?
SqlServer的作业调度是比较全面的.总结起来如下:1. 从2010-2-1日开始一直执行,每隔3天执行一次,在9:30:00执行.
2. 在2010-2-1至2010-12-20之间,每隔4天执行,当天内从9:00:00至20:00:00每隔2小时执行一次.
3. 在2010-2-1至2010-12-20之间,每隔2周后在周一/周二/周四执行一次,在10点执行.
4. 在2010-2-1至2010-12-20之间,每隔2周后在周六/周日各执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
5. 在2010-2-1至2010-12-20之间,每隔2月后在3号执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
6. 在2010-2-1至2010-12-20之间,每隔2月后在第2个周五执行,执行当天从9:00:00至20:00:00每隔2小时执行一次. 我只是知道每隔N天<周/月>执行一次的写法用simpleTrigger就行.
具体某天的某点执行呢,可以用cronTrigger.
但像这种,每隔N天执行,且当日内还循环执行的嵌套类型.我还真不知道怎么弄.
各位大虾帮助啊.谢谢了.
过年了.先给各位提前拜年啦.
SqlServer的作业调度是比较全面的.总结起来如下:1. 从2010-2-1日开始一直执行,每隔3天执行一次,在9:30:00执行.
2. 在2010-2-1至2010-12-20之间,每隔4天执行,当天内从9:00:00至20:00:00每隔2小时执行一次.
3. 在2010-2-1至2010-12-20之间,每隔2周后在周一/周二/周四执行一次,在10点执行.
4. 在2010-2-1至2010-12-20之间,每隔2周后在周六/周日各执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
5. 在2010-2-1至2010-12-20之间,每隔2月后在3号执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
6. 在2010-2-1至2010-12-20之间,每隔2月后在第2个周五执行,执行当天从9:00:00至20:00:00每隔2小时执行一次. 我只是知道每隔N天<周/月>执行一次的写法用simpleTrigger就行.
具体某天的某点执行呢,可以用cronTrigger.
但像这种,每隔N天执行,且当日内还循环执行的嵌套类型.我还真不知道怎么弄.
各位大虾帮助啊.谢谢了.
过年了.先给各位提前拜年啦.
解决方案 »
- 求这个spring面试题的答案
- 求教:你们有遇到过在本地样式没问题,上传到服务器之后样式加载不出来的问题吗?
- 郁闷的数据转换
- JAVA中如何求出某个月的星期二,星期五是哪几天
- Myeclipse8.0部署Struts1.2问题
- 请问有没有这样一个完全的分布式系统
- 在线等,java调用通过sqlserver2005发布的soap报http505错误!
- hibernate插入数据时候遇到得问题,大家看看,怎么帮我解决??
- 在action執行完後,forward到另一action時,怎么帶參數
- 谁有下雪效果的Java程序?
- 关于hibernate flush的思考
- Spring 配置JBOSS JNDI
想想....
如对2来说:
2. 在2010-2-1至2010-12-20之间,每隔4天执行,当天内从9:00:00至20:00:00每隔2小时执行一次.弄一个每隔4天执行的SimpleTrigger,绑定到一个JobA上.JobA的工作是启动另一个JobB,给JobB赋值上一个Trigger是JobA执行日当天内,从9点到20点之内每隔2小时循环执行...貌似可以呀???我仔细琢磨琢磨...
位置 时间域名 允许值 允许的特殊字符
1 秒 0-59 , - * /
2 分钟 0-59 , - * /
3 小时 0-23 , - * /
4 日期 1-31 , - * ? / L W C
5 月份 1-12 , - * /
6 星期 1-7 , - * ? / L C #
7 年(可选) 空值1970-2099 , - * /
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表示式的实例:
Cron表示式示例
表示式 说明
"0 0 12 * * ? " 每天12点运行
"0 15 10 ? * *" 每天10:15运行
"0 15 10 * * ?" 每天10:15运行
"0 15 10 * * ? *" 每天10:15运行
"0 15 10 * * ? 2008" 在2008年的每天10:15运行
"0 * 14 * * ?" 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
"0 0/5 14 * * ?" 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
"0 0/5 14,18 * * ?" 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
"0 0-5 14 * * ?" 每天14:00点到14:05,每分钟运行一次。
"0 10,44 14 ? 3 WED" 3月每周三的14:10分到14: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 2007-2009" 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
"0 15 10 ? * 6#3" 每月第三个星期五的10:15分运行。
<quartz>
<job>
<job-detail>
<name></name>
<group></group>
<job-class></job-class>
<job-data-map allows-transient-data="true">
<entry>
<key></key>
<value></value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<cron>
<name></name>
<group></group>
<job-name></job-name>
<job-group></job-group>
<cron-expression>0 0/5 * * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>
这个简单:不用说了.2. 在2010-2-1至2010-12-20之间,每隔4天执行,当天内从9:00:00至20:00:00每隔2小时执行一次.
建立一个JobA,目的是调用JobB,JobB中才是你要实现的具体业务功能.注意JobA和JobB最好都是用StatefulJob,那样可以传递参数.JobA的trigger是负责执行天的:
new SimpleTrigger("TriggerID","trigerGroup",new Date(2010-2-1),new Date(2010-12-20),SimpleTrigger.REPEAT_INDEFINITELY,4天*24*3600*1000L).
JobB的trigger是执行当日循环的/或者当日一次:
new SimpleTrigger("TriggerID","trigerGroup",new Date('当日期'+9:00:00),new Date('当日起'+20:00:00),SimpleTrigger.REPEAT_INDEFINITELY,2小时*3600*1000L).
3. 在2010-2-1至2010-12-20之间,每隔2周后在周一/周二/周四执行一次,在10点执行.
每隔2周执行,好像没有类似的("0 0 0 ? * MON/2,TUE/2,THU/2")吧??如果不行的话,只能写每周执行一次的.
执行时得到本次trigger上次的执行时间tr.getPreviousFireTime().和当前时间对比.是否是间隔2周.不过在哪里比较.我还没做过.job中?肯定不行.楼主查查吧.还有.好像能赋值给一个trigger一个自己的日历.楼主也可以从这方面想想,
或者有人用JobListener和 InInterruptableJob接口去实现,在listener 中判断当前时间的 week_of_year(一年内的第几个星期) 能否被 interval(星期的间隔) 整除,如果不能整除就跳过这次的job执行4. 在2010-2-1至2010-12-20之间,每隔2周后在周六/周日各执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
同35. 在2010-2-1至2010-12-20之间,每隔2月后在3号执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
想法类似2,先JobA每隔2个月的三号执行.crontrigger:"0 0 0 3 */2 ?".好像cron表达式不能写从某日到某日执行吧?只能写某年至某年,所以干脆,在JobA中判断当前日期是否满足2010-2-1至2010-12-20条件,满足时,则调用JobB. JobB中trigger同2了.6. 在2010-2-1至2010-12-20之间,每隔2月后在第2个周五执行,执行当天从9:00:00至20:00:00每隔2小时执行一次.
这个貌似最难弄.想法同5.JobA的trigger是"0 0 0 3 */2 6#3",没有测试.楼主试试看.JobB同2了.
周一/周二/周四 执行: WeeklyCalendar setDayExcluded(星期3,true),setDayExcluded(星期5,true)
2-1至12-20 CronTrigger setStartTime(2010-02-01) setEndTime(2010-12-20)