2019独角兽企业重金招聘Python工程师标准>>>

前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出

CronTrigger 这个重要人物了.

CronTrigger也是Quartz最重要的特色之一,通过Quartz特有的Cron表达式来确定某类时间,能完成类似"2011年11月11号(神棍节,已经过去了),每个星期三XXX"之类的复杂定时任务。

代码还是老套路 , 两个类 : SimpleJob.java  和 CronTriggerExample.java

建议先跑代码 ,看结果 ,然后再 看代码

SimpleJob.java

package net.itaem.annnodemo.anno.task.task1;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;
import java.util.Calendar;/*** Created with IntelliJ IDEA.* Description:* User: zhubo* Date: 2017-10-24* Time: 15:33*/
public class SimpleJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// job 的名字String jobName = context.getJobDetail().getKey().getName();// 任务执行的时间SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 时 mm 分 ss 秒");String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());// 输出任务执行情况System.out.println("任务 : " + jobName + " 在  " +jobRunTime + " 执行了 ");}
}

CronTriggerExample.java

package net.itaem.annnodemo.anno.task.task2;import net.itaem.annnodemo.anno.task.task1.SimpleJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;import java.text.SimpleDateFormat;
import java.util.Date;/*** Created with IntelliJ IDEA.* Description:* User: zhubo* Date: 2017-10-24* Time: 16:30*/
public class CronTriggerExample {public static void main(String[] args) throws Exception{new CronTriggerExample().run();}public void run() throws Exception {// 日期格式化SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日  HH 时 mm 分 ss 秒");SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();System.out.println("--------------- 初始化 -------------------");// job1 每20s运行一次JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build();CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ?")).build();Date ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:每20s运行一次)");// job2 偶数分钟的第15秒运行job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build();trigger =  TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").withSchedule(CronScheduleBuilder.cronSchedule("15 0/2 * * * ?")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:偶数分钟的第15秒运行)");// job3 从8时到17时 ,每个 偶数分钟执行一次job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build();trigger =  TriggerBuilder.newTrigger().withIdentity("trigger3", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 8-17 * * ?")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:从8时到17时 ,每个 偶数分钟执行一次)");// job4 从17时到23时,每3分钟运行一次job = JobBuilder.newJob(SimpleJob.class).withIdentity("job4", "group1").build();trigger =  TriggerBuilder.newTrigger().withIdentity("trigger4", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0 0/3 17-23 * * ?")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义: 从17时到23时,每3分钟运行一次)");// job5 每个月的1号和15号的上午10点 运行job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build();trigger = TriggerBuilder.newTrigger().withIdentity("trigger5", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0 0 10am 1,15 * ?")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:每个月的1号和15号的上午10点 运行)");// job6 周一至周五,每30秒运行一次job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build();trigger = TriggerBuilder.newTrigger().withIdentity("trigger6", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0,30 * * ? * MON-FRI")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:周一至周五,每30秒运行一次 )");// job7 周六,周日 每30秒运行job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build();trigger = TriggerBuilder.newTrigger().withIdentity("trigger7", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0,30 * * ? * SAT,SUN")).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 将在: "+ dateFormat.format(ft) + " 运行 . 并且基于Cron表达式 : "+ trigger.getCronExpression() + "  (含义:周六,周日  每30秒运行 )");sched.start();System.out.println("------- 开始调度 (调用.start()方法) ----------------");System.out.println("------- 等待5分钟,给任务的调度留出时间  ... ------------");try {Thread.sleep(300L * 1000L);} catch (Exception e) {}sched.shutdown(true);System.out.println("------- 调度已关闭 ---------------------");// 显示一下 已经执行的任务信息SchedulerMetaData metaData = sched.getMetaData();System.out.println("~~~~~~~~~~  执行了 "+ metaData.getNumberOfJobsExecuted() + " 个 jobs.");}
}

你也许发现什么是关键了?

yes你是对的.就是这些东西

0 0/2 8-17 * * ?

0 0 10am 1,15 * ?

0,30 * * ? * MON-FRI

由它们可以 灵活的组织出 你想要执行任务的时间.下面让我们来看看这东西的具体含义

在这之前,我们先看一下几个例子吧:

  1. --------------------------------------
  2. 0 0 12 * * ?            每天12点触发
  3. 0 15 10 ? * *           每天10点15分触发
  4. 0 15 10 * * ?           每天10点15分触发
  5. 0 15 10 * * ? *         每天10点15分触发
  6. 0 15 10 * * ? 2005      2005年每天10点15分触发
  7. 0 * 14 * * ?            每天下午的 2点到2点59分每分触发
  8. 0 0/5 14 * * ?          每天下午的 2点到2点59分(整点开始,每隔5分触发)
  9. 0 0/5 14,18 * * ?       每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)
  10. 0 0-5 14 * * ?          每天下午的 2点到2点05分每分触发
  11. 0 10,44 14 ? 3 WED      3月分每周三下午的 2点10分和2点44分触发
  12. 0 15 10 ? * MON-FRI     从周一到周五每天上午的10点15分触发
  13. 0 15 10 15 * ?          每月15号上午10点15分触发
  14. 0 15 10 L * ?           每月最后一天的10点15分触发
  15. 0 15 10 ? * 6L          每月最后一周的星期五的10点15分触发
  16. 0 15 10 ? * 6L 2002-2005    从2002年到2005年每月最后一周的星期五的10点15分触发
  17. 0 15 10 ? * 6#3         每月的第三周的星期五开始触发
  18. 0 0 12 1/5 * ?          每月的第一个中午开始每隔5天触发一次
  19. 0 11 11 11 11 ?         每年的11月11号 11点11分触发(光棍节)
  20. --------------------------------------

怎么样? 有没有发现规律,还用往下看吗? 你说了蒜 0.0~!

CronTrigger配置格式:

格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符
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相同.

如果还嫌讲的不够多,请到我的百度网盘(没有广告嫌疑吧)   地址:http://pan.baidu.com/share/link?shareid=343136&uk=838886155

里面有一些资料,参见:《cron表达式.doc》

转载于:https://my.oschina.net/LucasZhu/blog/1555629

作业调度框架 Quartz 学习笔记(三) -- Cron表达式相关推荐

  1. quartz 每30秒执行一次_作业调度框架 Quartz 学习笔记(三) -- Cron表达式

    前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出 CronTrigger 这个重要人物了. Cro ...

  2. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  3. .NET开源作业调度框架Quartz

    .NET开源作业调度框架Quartz 一 Quartz简介 Quartz是一个强大.开源.轻量的作业调度框架,你能够用它来为执行一个简单或复杂的作业调度任务. 是对非常流行的JAVA开源调度框架 Qu ...

  4. 轻量级HTTP客户端框架—Forest学习笔记

    轻量级HTTP客户端框架-Forest学习笔记 一.Forest 1.1 业务需求 一般情况下是后端提供接口,前端调用,解决需求,但是有的时候为了方便,复用别人的接口(网上的,公共的第三方接口(短信. ...

  5. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  6. python3常用模块_Python学习笔记三(常用模块)

    Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...

  7. Mongodb使用学习笔记(三)

    文章目录 Mongodb使用学习笔记(三) 1. MongoDB 更新文档 1.1 update() 1.2 save() Mongodb使用学习笔记(三) 1. MongoDB 更新文档 参考:Mo ...

  8. K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程

    K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...

  9. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

最新文章

  1. 最近面试了一位4年的Java,什么都不知道!还自认为很牛逼...
  2. 利用SQL Server EXISTS结构
  3. Java工程中使用Log4j小记
  4. pcb matrix ipc lp viewer软件中SMN、SMM、SML三个库的区别
  5. The writeAsCsv() method can only be used on data sets of tuples.
  6. 分块入门(根据hzwer的博客。。)(右端点是r不是n。。)
  7. 职高计算机选修6知识点,(计算机基础考试7.doc
  8. python设计模式16-迭代器模式
  9. 【最短路径问题笔记】Floyd算法求多源最短路径问题
  10. 用rsync对网站进行镜像备份(不靠谱)
  11. leetcode77
  12. Activity保存状态saving activity state和onPause()
  13. IAR工程适配GD32芯片
  14. c语言中的正号运算符,C语言 运算符
  15. div css 会员登录表单,html5 css3谷歌会员登录表单界面特效
  16. 算法:什么是棒球游戏问题?
  17. html中onblur属性,html中的onfocus和onblur是什么属性?怎么使用?
  18. 人大金仓删除字段_人大金仓数据库V7升级V8遇到的一些问题
  19. U3D中ShaderForge插件使用系列教程之一
  20. 8086CPU有哪些寄存器组成?各有什么用途?标志寄存器的各标志位在什么情况下置位?

热门文章

  1. Silverlight实用窍门系列:52.Silverlight中的MVVM框架极速入门(以MVVM Light Toolkit为例)...
  2. SQLite管理工具绿色
  3. iphone通讯录批量删除_iPhone通讯录删除了如何恢复?用对方法快速找回,亲测有效!_...
  4. Python解密2021年最新富豪榜,马云居然连前三都没进
  5. oracle 修改用户密码_干货!数据库安全之Oracle数据库安全加固
  6. python的for语句条件_Python中的条件选择和循环语句
  7. N-API中的Promise功能的使用
  8. Linux之Vim文本代码编辑神器应用get技巧
  9. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
  10. 批量处理word文件内容_用python批量提取word文件信息,导出到excel文件