如何用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天执行,且当日内还循环执行的嵌套类型.我还真不知道怎么弄.
各位大虾帮助啊.谢谢了.
过年了.先给各位提前拜年啦.

解决方案 »

  1.   

    好像要使用多个<cron>了。。
      

  2.   

    多个cron??还真没弄过.
    想想....
    如对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小时循环执行...貌似可以呀???我仔细琢磨琢磨... 
      

  3.   

    Cron表达式时间字段
    位置 时间域名 允许值 允许的特殊字符
    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分运行。
     
      

  4.   

    quartz_job.xml
    <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>  
      

  5.   

    1. 从2010-2-1日开始一直执行,每隔3天执行一次,在9:30:00执行.
    这个简单:不用说了.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了.
      

  6.   

    6. 中的trigger是"0 0 0  */2 6#3",没有3.呵呵
      

  7.   

    6. 中的trigger是"0 0 0 * */2 6#3",没有3.少个*.哈哈
      

  8.   

    9:00:00至20:00:00 执行: DailyCalendar setTimeRange(09:00:00,20:00:00) and setInvertTimeRange(true)
    周一/周二/周四  执行: WeeklyCalendar setDayExcluded(星期3,true),setDayExcluded(星期5,true)
    2-1至12-20   CronTrigger setStartTime(2010-02-01) setEndTime(2010-12-20)
      

  9.   

    试了试 多个trigger接连触发是可以的.还没测试11楼的方法.继续等高手来