四. 为 CronTrigger 使用起迄日期

Cron 表达式是用来决定一个 Trigger 被触发执行一个 Job 的日期和次数。当你创建一个 CronTrigger 实例,假如没为它指定一个开始时间,这个 Trigger 当然就会假定是在依赖于 Cron 表达式尽早的被触发。例如,如果你用这个表达式
0 * 14-20 * * ?
这个 Trigger 会在每天的从下午 2 点到下午的 7:59 间的每分钟触发一次。一旦你运行了这个表达式的 CronTrigger,假如当前是下午 2 点后(不能超过 7:59 PM--译者注),它将会立即触发。它会在每天无限期的被触发。
另一方面,倘若你希望这个计划直到下一天才开始,并且只执行两天,你就可以用 CronTrigger 的 setStartTime() 和 setEndTime() 方法来形成一个 "定时箱" 来触发。代码 5.2 描述了限定 CronTrigger 仅触发两天的例子。
代码 5.2. 你可以对 CronTrigger 用 startTime 和 endTime

  1. public class Listing_5_2 {
  2. static Log logger = LogFactory.getLog(Listing_5_2.class);
  3. public static void main(String[] args) {
  4. Listing_5_2 example = new Listing_5_2();
  5. example.runScheduler();
  6. }
  7. public void runScheduler() {
  8. Scheduler scheduler = null;
  9. try {
  10. // Create a default instance of the Scheduler
  11. scheduler = StdSchedulerFactory.getDefaultScheduler();
  12. scheduler.start();
  13. logger.info("Scheduler was started at " + new Date());
  14. // Create the JobDetail
  15. JobDetail jobDetail = new JobDetail("PrintInfoJob",
  16. Scheduler.DEFAULT_GROUP,
  17. PrintInfoJob.class);
  18. // Create a CronTrigger
  19. try {
  20. // cron that fires every min from 2  8pm
  21. CronTrigger trigger =
  22. new CronTrigger("MyTrigger", null,
  23. "0 * 14-20 * * ?");
  24. Calendar cal = Calendar.getInstance();
  25. // Set the date to 1 day from now
  26. cal.add(Calendar.DATE, 1);
  27. trigger.setStartTime(cal.getTime());
  28. // Move ahead 2 days to set the end time
  29. cal.add(Calendar.DATE, 2);
  30. trigger.setEndTime(cal.getTime());
  31. scheduler.scheduleJob(jobDetail, trigger);
  32. } catch (ParseException ex) {
  33. logger.error("Couldn't parse cron expr", ex);
  34. }
  35. } catch (SchedulerException ex) {
  36. logger.error(ex);
  37. }
  38. }
  39. }

public class Listing_5_2 { static Log logger = LogFactory.getLog(Listing_5_2.class); public static void main(String[] args) { Listing_5_2 example = new Listing_5_2(); example.runScheduler(); } public void runScheduler() { Scheduler scheduler = null; try { // Create a default instance of the Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); logger.info("Scheduler was started at " + new Date()); // Create the JobDetail JobDetail jobDetail = new JobDetail("PrintInfoJob", Scheduler.DEFAULT_GROUP, PrintInfoJob.class); // Create a CronTrigger try { // cron that fires every min from 2 8pm CronTrigger trigger = new CronTrigger("MyTrigger", null, "0 * 14-20 * * ?"); Calendar cal = Calendar.getInstance(); // Set the date to 1 day from now cal.add(Calendar.DATE, 1); trigger.setStartTime(cal.getTime()); // Move ahead 2 days to set the end time cal.add(Calendar.DATE, 2); trigger.setEndTime(cal.getTime()); scheduler.scheduleJob(jobDetail, trigger); } catch (ParseException ex) { logger.error("Couldn't parse cron expr", ex); } } catch (SchedulerException ex) { logger.error(ex); } } }
代码 5.2 中的例子使用了 java.util.Calendar 来为 Trigger 选择一个开始和结束时间周期。在上面例子中,Trigger 将会在 Scheduler 启动后的下一天开始触发,并只在开始触发后的两天内有效。
使用 CronTrigger 的 startTime 和 endTime 属性的效果有点像 SimpleTrigger。
五. 为 CronTrigger 使用 TriggerUtils
在第四章,"安排 Job" 中介绍了 org.quartz 包中的 TriggerUtils 类,它简化了两种类型的 Trigger 的创建。只要可能的话,你应该尝试用 TriggerUtils 类的方法来创建你的 Trigger。
例如,假如你需要在每天的下午 5:30 执行一个 Job,你可以用下面的代码:

  1. try {
  2. // A CronTrigger that fires @ 5:30PM
  3. CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 17 ? * *");
  4. } catch (ParseException ex) {
  5. logger.error("Couldn't parse cron expression", ex);
  6. }

try { // A CronTrigger that fires @ 5:30PM CronTrigger trigger = new CronTrigger("CronTrigger", null, "0 30 17 ? * *"); } catch (ParseException ex) { logger.error("Couldn't parse cron expression", ex); }
或者你能用上 TriggerUtils,如下:

  1. // A CronTrigger that fires @ 5:30PM
  2. Trigger trigger = TriggerUtils.makeDailyTrigger(17, 30);
  3. trigger.setName("CronTrigger");

// A CronTrigger that fires @ 5:30PM Trigger trigger = TriggerUtils.makeDailyTrigger(17, 30); trigger.setName("CronTrigger");
TriggerUtils 使得我们更简单方便的使用 Trigger,而又未放弃太多的灵活性。
六. 在 JobInitializationPlugin 中使用 CronTrigger

尽管我们要到第八章,"使用 Quartz 插件" 才会讲到插件,但还是值得提前展现一下 CronTrigger 如何应用于  quartz_jobs.xml 文件中来指定 Job 信息的。JobInitialzationPlugin 可用来从 XML 文件中加载 Job 的信息。
正如 SimpleTrigger 一样,你可在 XML 文件中指定 CronTrigger 的表达式,并且 Quartz 的 Scheduler 将会利用这一信息来安排你的 Job。这对于你想在你的程序代码之外声明你的 Job 信息时特别方便。代码 5.3 显示了 quartz_jobs.xml 文件内容,它被 JobInitializationPlugin  用来加作 Job 信息。
代码 5.3. CronTrigger 可在 XML 文件中指定,并由 JobInitializationPlugin 加载

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <quartz>
  3. <job>
  4. <job-detail>
  5. <name>PrintInfoJob</name>
  6. <group>DEFAULT</group>
  7. <description>
  8. A job that prints out some basic information.
  9. </description>
  10. <job-class>
  11. org.cavaness.quartzbook.common.PrintInfoJob
  12. </job-class>
  13. </job-detail>
  14. <trigger>
  15. <cron>
  16. <name>printJobInfoTrigger</name>
  17. <group>DEFAULT</group>
  18. <job-name>PrintInfoJob</job-name>
  19. <job-group>DEFAULT</job-group>
  20. <!-- Fire 7:30am Monday through Friday -->
  21. <cron-expression>0 30 7 ? * MON-FRI</cron-expression>
  22. </cron>
  23. </trigger>
  24. </job>
  25. </quartz>

<?xml version='1.0' encoding='utf-8'?> <quartz> <job> <job-detail> <name>PrintInfoJob</name> <group>DEFAULT</group> <description> A job that prints out some basic information. </description> <job-class> org.cavaness.quartzbook.common.PrintInfoJob </job-class> </job-detail> <trigger> <cron> <name>printJobInfoTrigger</name> <group>DEFAULT</group> <job-name>PrintInfoJob</job-name> <job-group>DEFAULT</job-group> <!-- Fire 7:30am Monday through Friday --> <cron-expression>0 30 7 ? * MON-FRI</cron-expression> </cron> </trigger> </job> </quartz>
代码  5.3 中的 Cron 表达式与 代码 5.1 中。当 Quartz 加载这个 XML 后,就会安排 PrintInfoJob (也已在 XML  中列出) 在从星期一到星期五的早上 7:30 执行。关于 JobInitializationPlugin 更多的说明见第八章。

Cron 触发器及相关内容 (第三部分)相关推荐

  1. Cron 触发器及相关内容 (第四部分)

    七. Cron 表达式 Cookbook 此处的 Cron 表达式 cookbook 旨在为常用的执行需求提供方案.尽管不可能列举出所有的表达式,但下面的应该为满足你的业务需求提供了足够的例子. ·分 ...

  2. Cron 触发器及相关内容 (第二部分)

    三. cron 表达式的格式 Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX ...

  3. Cron 触发器及相关内容 (第一部分)

    我们在上章中有承诺过会花更多时间来讲 Quartz 的 CronTrigger,所以不会让你失望的.SimpleTrigger 对于需要在指定的毫秒处及时执行的作业还是不错的,但是假如你的作业需要更复 ...

  4. pandas pandas具体用法相关内容(三)

    pandas pandas具体用法相关内容(三) #%%import pandas as pd import numpy as np titanic_survival = pd.read_csv(&q ...

  5. Promise相关内容(三)——异步获取服务器数据:promise方式解决回调地狱的问题。通过多个.then使代码可读性更高 实现异步任务的串行执行,保证按顺序发送请求获取数据

    Promise相关内容(三)--异步获取服务器数据:promise方式解决回调地狱的问题.通过多个.then使代码可读性更高 & 实现异步任务的串行执行,保证按顺序发送请求获取数据 第一种形式 ...

  6. 移动端 h5开发相关内容总结(三)

    之前写过两篇开发中遇到的问题和解决方案.当时是CSS 和 JavaScript 分开写的.现在写这篇文章的时候感觉很多内容都是有内在联系的,所以不好分开. 给大家分享一下这半年来的感受吧: 知道和理解 ...

  7. 在wps里面怎么设置触发器_利用WPS演示中的触发器控制板书内容的方法

    难道多媒体教学的开展与传统的板书之间的矛盾真的不可调和吗?笔者一直在思考这一问题,并发现巧妙利用WPS演示中的触发器可以灵活控制板书内容的显示与隐藏,使我们在开展多媒体辅助教学的过程中合理兼顾板书,达 ...

  8. 计算机一级b和小高考,2021年小高考B是几分相关内容

    <2021年小高考B是几分相关内容>由会员分享,可在线阅读,更多相关<2021年小高考B是几分相关内容(3页珍藏版)>请在人人文库网上搜索. 1.小高考B是几分相关内容 小高考 ...

  9. 人人视频从 App Store 下架整改,并下线“快看”相关内容,网友:我追的剧怎么办?...

    今日,据多位网友爆料,人人视频已经从App Store下架,所有视频下架,并下线"快看"相关内容.相关话题迅速登上微博热搜. 对于此问题,小编去App Store下载发现的确已经搜 ...

最新文章

  1. k8s使用glusterfs存储报错type 'features/utime'
  2. 浅谈代码的执行效率(2):编译器的威力
  3. python计算短时自相关函数 音频信号_librosa与python_speech_features
  4. TCP/IP(二):IP协议
  5. 谷歌浏览器怎么设置点击书签 谷歌浏览器如何设置点击书签
  6. 湖泊的水色、水环境、水文遥感的区别
  7. Python图书馆管理系统
  8. 《数字电子技术基础》3.3 CMOS门电路(上)
  9. k3刷机 重置_斐讯K3全版本刷机教程2019-不用降级开telnet拆机TTL
  10. Android 各大市场更改APP名称
  11. 总结一下Android中主题(Theme)的正确玩法
  12. Python深度学习笔记04——tensorflow实现神经网络(壹)
  13. 【音频分析】短时傅立叶变换结果为啥是对称?每个结果对应的频率是多少?
  14. 《肖申克的救赎》- 阅后小记
  15. java html5转pdf文件_Java 将Html转为PDF
  16. 尼康D500套机相机黑屏是怎么回事
  17. 不要让别人影响到你的心情
  18. 小程序毕设作品之微信美食菜谱小程序毕业设计成品(3)后台功能
  19. 关于android:打开键盘后WebView不会滚动
  20. Ubuntu 20.04下搭建奥比中光-Astra(详细教程)

热门文章

  1. java 线程锁概念_Java多线程——锁概念与锁优化
  2. 2021年的Angular最佳实践
  3. Blazor确认复选框组件
  4. Postgres外部表示例
  5. ILSpy 6.0 Preview 1 发布,.NET 反编译工具
  6. 超炫酷的 Docker 终端 UI lazydocker,想看哪里点哪里
  7. vue用html做报表,Vue配置生成无限分割的表格,可快速实现任意复杂报表
  8. centos 5.11 mysql_CentOS 5.11rpm方式安装mysql
  9. php fpm core,在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件...
  10. syn flood 攻击 c 语言源代码,利用Python和C实现syn flood攻击