博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz入门例子简介 从入门到菜鸟(三)
阅读量:4981 次
发布时间:2019-06-12

本文共 3137 字,大约阅读时间需要 10 分钟。

前面两个博客讲的都是简单触发器,直接传入一个时间让任务执行,这一话讲CronTrigger的例子。 

CronTrigger也是Quartz最重要的特色之一,通过Quartz特有的Cron表达式来确定某类时间,能完成类似"每个月二十号XXX,每个星期三XXX"之类的任务。 

先对MyJob做个小的修改,时间用中文来输出,不然看起来太费劲,逻辑上没有任何修改。 
Java代码

  1. public class MyJob implements Job {  

  2.    @Override  

  3.    public void execute(JobExecutionContext context) throws JobExecutionException {  

  4.        String jobName = context.getJobDetail().getKey().getName();  

  5.        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");  

  6.        System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + dateFormat.format(Calendar.getInstance().getTime()));  

  7.    }  

  8. }  


接下来创建QuartzCronTest.java,这里采用了CronTrigger作为触发器,注意NOTICE注释下面的代码: 
Java代码

  1. public class QuartzCronTest {  

  2.  

  3.    public static void main(String[] args) throws Throwable {  

  4.        SchedulerFactory factory = new StdSchedulerFactory();  

  5.        Scheduler scheduler = factory.getScheduler();  

  6.  

  7.        JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();  

  8.        // @NOTICE  

  9.        // 与SimpleTrigger对比:类不同了,现在的是Trigger的子类CronTrigger;withSchedule中的参数变为CronScheduleBuilder了  

  10.        // CronScheduleBuilder可以通过类似"0/13 * * * * ?"这种表达式来创建定时任务  

  11.        // 当前这个表达式的定义是每个秒是13的倍数,或者是0的时候,都触发任务  

  12.        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")  

  13.                .withSchedule(CronScheduleBuilder.cronSchedule("0/13 * * * * ?")).build();  

  14.  

  15.        scheduler.scheduleJob(job, trigger);  

  16.  

  17.        scheduler.start();  

  18.        try {  

  19.            // 等待60秒查看效果  

  20.            Thread.sleep(60L * 1000L);  

  21.        } catch (Exception e) {  

  22.        }  

  23.        scheduler.shutdown(true);  

  24.    }  

  25. }  

  26. /*

  27. --------------------------------------

  28.    0 0 12 * * ?            每天12点触发

  29.    0 15 10 ? * *           每天10点15分触发

  30.    0 15 10 * * ?           每天10点15分触发

  31.    0 15 10 * * ? *         每天10点15分触发

  32.    0 15 10 * * ? 2005      2005年每天10点15分触发

  33.    0 * 14 * * ?            每天下午的 2点到2点59分每分触发

  34.    0 0/5 14 * * ?          每天下午的 2点到2点59分(整点开始,每隔5分触发)

  35.    0 0/5 14,18 * * ?       每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)

  36.    0 0-5 14 * * ?          每天下午的 2点到2点05分每分触发

  37.    0 10,44 14 ? 3 WED      3月分每周三下午的 2点10分和2点44分触发

  38.    0 15 10 ? * MON-FRI     从周一到周五每天上午的10点15分触发

  39.    0 15 10 15 * ?          每月15号上午10点15分触发

  40.    0 15 10 L * ?           每月最后一天的10点15分触发

  41.    0 15 10 ? * 6L          每月最后一周的星期五的10点15分触发

  42.    0 15 10 ? * 6L 2002-2005    从2002年到2005年每月最后一周的星期五的10点15分触发

  43.    0 15 10 ? * 6#3         每月的第三周的星期五开始触发

  44.    0 0 12 1/5 * ?          每月的第一个中午开始每隔5天触发一次

  45.    0 11 11 11 11 ?         每年的11月11号 11点11分触发(光棍节)

  46. --------------------------------------

  47. */  


其实使用起来很简单,把Trigger的传入“升级”为CronTrigger就可以了,通过CronScheduleBuilder把"0 0 12 * * ?"这样的Cron表达式传入CronTrigger当中,任务就可以在指定的时间自动执行啦。 

下面着重介绍一下Cron表达式,个人认为上面列出来的足够使用了,如果有进阶需求的话,需要先对Cron表达式中的结构和符号有一定了解: 

Quartz Cron 表达式支持到七个域
名称 是否必须 允许值 特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT , - * ? / L #
空 或 1970-2099 , - * /


首先,结构,以这个为例 

引用
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)


可以看到基本结构是   秒_分_小时_日_月_[周]_[年] 后面的周和年是可选的 

其次,通配符,主要的有星号(*);问号(?);减号(-);逗号(,);斜杠(/);L字母;W字母;井号(#). 

  • 星号:表示任意时刻

  • 问号:只能在日或周字段上使用, 这里有比较清晰的解释,简单的理解就是日期和星期是有冲突的,指定其中一个的话,另外一个是没办法指定的,比如每个月12号和每个星期二,这两个是"互斥"的,不能用日期和周来指定所有“每个是星期二的12号”这个时间。

  • 减号:范围,如 1-5秒

  • 逗号:列表,如 1,5,10 秒

  • 斜杠:等步长序列,如3/13秒 表示 3,16,29,42,55,3,16...

  • L:仅在日和周上支持,表示允许的最后一个值,注意不要让范围和列表与L连用

  • W:工作日

  • 井号:为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。

井号和L W用的比较少,其实简单实用的话,根据那些注释中的去改就够了~~

 

本文链接:,转自:http://wwwcomy.iteye.com

转载于:https://www.cnblogs.com/licomeback/articles/3057016.html

你可能感兴趣的文章
python中分页使用
查看>>
爬虫学习推荐目录
查看>>
[CSS] Change the Alignment of a Single Flexed Item with 'align-self'
查看>>
[Dart] Capture and Handle Data Sequences with Streams in Dart
查看>>
[Dart] splitMapJoin
查看>>
[Angular] Show a Loading Indicator for Lazy Routes in Angular
查看>>
[HTML5] Lazyload below the fold images and iframes with native browser lazy-loading
查看>>
[HTML5] Add Semantic Styling to the Current Page of a Navigation Item with aria-current
查看>>
[React Native] Up & Running with React Native & TypeScript
查看>>
[CSS] Change the off-axis Alignment of a Flexed Container with `align-items`
查看>>
[Javascript] Run asynchronous functions in sequence using reduce
查看>>
[React] Create a Query Parameter Modal Route with React Router
查看>>
[Algorithm] Tree Width with Level Width
查看>>
[GraphQL] Set variable and default value & alias
查看>>
[Dart] final vs const
查看>>
[GraphQL] Reuse GraphQL Selection Sets with Fragments
查看>>
[GraphQL] Query GraphQL Interface Types in GraphQL Playground
查看>>
[Javascript] Convert a forEach method to generator
查看>>
[Flutter] Stack Layout
查看>>
[GraphQL] Query Lists of Multiple Types using a Union in GraphQL
查看>>