尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用。

本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册。 您可以自由编写自己的插件,但我们将专注于Quartz随附的现有插件。

LoggingTriggerHistoryPlugin

首先介绍一些背景。 Quartz中的两个主要抽象是作业和触发器。 Job是我们要计划的一段代码。 触发器指示调度程序何时应运行此代码。 CRON(例如,每个星期五在9 AM到5 PM之间运行直到11月)和简单的(每2小时运行100次)触发器是最常用的。 您可以将任意数量的触发器关联到一个作业。

信不信由你,Quartz默认不提供任何日志记录或监视任何已执行的作业和触发器。 有一个API,但是没有实现内置的日志记录。 它不会向您显示由于触发触发器而现在可以执行此特定作业。 因此,您应该做的第一件事是将以下几行添加到quartz.properties中:

org.quartz.plugin.triggerHistory.class=org.quartz.plugins.history.LoggingTriggerHistoryPluginorg.quartz.plugin.triggerHistory.triggerFiredMessage=Trigger [{1}.{0}] fired job [{6}.{5}] scheduled at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}, next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}org.quartz.plugin.triggerHistory.triggerCompleteMessage=Trigger [{1}.{0}] completed firing job [{6}.{5}] with resulting trigger instruction code: {9}. Next scheduled at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}org.quartz.plugin.triggerHistory.triggerMisfiredMessage=Trigger [{1}.{0}] misfired job [{6}.{5}]. Should have fired at: {3, date, dd-MM-yyyy HH:mm:ss.SSS}

第一行(也是唯一需要的行)将加载插件类LoggingTriggerHistoryPlugin。 其余各行将配置插件,自定义日志消息。 我发现内置默认值不是很周全,例如,它们显示当前时间,这已经是日志框架消息的一部分。 您可以自由构造任何日志消息,有关详细信息,请参阅API。 添加这些额外的几行使调试和监视更加容易:

LoggingTriggerHistoryPlugin | Trigger [Demo.Every-few-seconds] fired job [Demo.Print-message] scheduled at:  04-04-2012 23:23:47.036, next scheduled at:  04-04-2012 23:23:51.036
//...job output
LoggingTriggerHistoryPlugin | Trigger [Demo.Every-few-seconds] completed firing job [Demo.Print-message] with resulting trigger instruction code: DO NOTHING. Next scheduled at:  04-04-2012 23:23:51.036

现在您知道为什么命名触发器(Demo.Every-few-seconds)和作业(Demo.Print-message)如此重要。

LoggingJobHistoryPlugin

还有另一个与日志记录相关的便捷插件:

org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobHistory.jobToBeFiredMessage=Job [{1}.{0}] to be fired by trigger [{4}.{3}], re-fire: {7}
org.quartz.plugin.jobHistory.jobSuccessMessage=Job [{1}.{0}] execution complete and reports: {8}
org.quartz.plugin.jobHistory.jobFailedMessage=Job [{1}.{0}] execution failed with exception: {8}
org.quartz.plugin.jobHistory.jobWasVetoedMessage=Job [{1}.{0}] was vetoed. It was to be fired by trigger [{4}.{3}] at: {2, date, dd-MM-yyyy HH:mm:ss.SSS}

规则是相同的–插件+额外配置。 有关详细信息和可能的占位符,请参见LoggingJobHistoryPlugin的JavaDoc 。 快速查看日志可以发现非常具有描述性的输出:

Trigger [Demo.Every-few-seconds] fired job [Demo.Print-message] scheduled at:  04-04-2012 23:34:53.739, next scheduled at:  04-04-2012 23:34:57.739
Job [Demo.Print-message] to be fired by trigger [Demo.Every-few-seconds], re-fire: 0
//...job output
Job [Demo.Print-message] execution complete and reports: null
Trigger [Demo.Every-few-seconds] completed firing job [Demo.Print-message] with resulting trigger instruction code: DO NOTHING. Next scheduled at:  04-04-2012 23:34:57.739

我不知道为什么默认情况下不启用这些插件。 毕竟,如果您不需要这样的详细输出,则可以在日志记录框架中将其关闭。 没关系,我认为在对Quartz执行进行故障排除时将它们安装到位是个好主意。

XMLSchedulingDataProcessorPlugin

这是一个非常全面的插件。 它读取包含作业的XML文件(默认名称为quartz_data.xml)并触发定义,并将其添加到调度程序中。 当您有一次需要添加一次的全局作业时,此功能特别有用。 插件可以更新现有的作业/触发器,也可以忽略XML文件(如果它们已经存在)–在使用JDBCJobStore时非常有用。

org.quartz.plugin.xmlScheduling.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin

在上述文章中,我们一直在手动将作业添加到调度程序中:

val trigger = newTrigger().withIdentity("Every-few-seconds", "Demo").withSchedule(simpleSchedule().withIntervalInSeconds(4).repeatForever()).build()val job = newJob(classOf[PrintMessageJob]).withIdentity("Print-message", "Demo").usingJobData("msg", "Hello, world!").build()scheduler.scheduleJob(job, trigger)

使用XML配置可以实现相同的效果,只需将以下quartz_data.xml放在CLASSPATH中:

<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd "><processing-directives><overwrite-existing-data>false</overwrite-existing-data><ignore-duplicates>true</ignore-duplicates></processing-directives><schedule><trigger><simple><name>Every-few-seconds</name><group>Demo</group><job-name>Print-message</job-name><job-group>Demo</job-group><repeat-count>-1</repeat-count><repeat-interval>4000</repeat-interval></simple></trigger><job><name>Print-message</name><group>Demo</group><job-class>com.blogspot.nurkiewicz.quartz.demo.PrintMessageJob</job-class><job-data-map><entry><key>msg</key><value>Hello, World!</value></entry></job-data-map></job></schedule></job-scheduling-data>

使用XML配置可以实现相同的效果,只需将以下quartz_data.xml放在CLASSPATH中:

org.quartz.plugin.xmlScheduling.fileNames=/etc/quartz/system-jobs.xml,/home/johnny/my-jobs.xml
org.quartz.plugin.xmlScheduling.scanInterval=60

关机钩子插件

最后但并非最不重要的是ShutdownHookPlugin。 小型但可能有用的插件,可以在JVM中注册关闭钩子,以便轻轻地停止调度程序。 但是,我建议关闭cleanShutdown –如果系统已经试图突然停止应用程序(通常是Spring通过SchedulerFactoryBean通过SchedulerFactoryBean调用调度程序关闭)或用户按下Ctrl + C –等待当前正在运行的作业似乎是个坏主意。 毕竟,也许由于某些作业运行时间过长/过长而导致我们正在终止应用程序?

org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=false

如您所见,Qurtz附带了一些非常有趣的插件。 由于某些原因,它们在官方文档中没有详细描述,但是它们工作得很好,并且是调度程序的重要补充。

带有已应用插件的源代码可在GitHub上获得。

参考: Quartz Scheduler插件– Java和社区博客上来自JCG合作伙伴 Tomasz Nurkiewicz的隐藏宝藏 。

翻译自: https://www.javacodegeeks.com/2012/04/quartz-scheduler-plugins-hidden.html

Quartz Scheduler插件–隐藏的宝藏相关推荐

  1. 【Quartz】插件的使用

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Quartz 框架提供了几种用于扩展平台能力的方式.通过使用各种 "钩子" (通 ...

  2. HOW-TO:具有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

    Quartz Scheduler是Java世界中最流行的调度库之一. 过去,我主要在Spring应用程序中使用Quartz. 最近,我一直在研究要在云中部署的JBoss 7.1.1上运行的JEE 6应 ...

  3. HOW-TO:带有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

    Quartz Scheduler是Java世界中最流行的调度库之一. 过去,我主要在Spring应用程序中使用Quartz. 最近,我一直在研究将在云中部署的JBoss 7.1.1上运行的JEE 6应 ...

  4. 如何使用Quartz Scheduler和日志记录创建Web应用程序

    我有时会在Quartz Scheduler论坛中为用户提供帮助. 有时,有人会问他/她如何在Web应用程序中设置Quartz. 实际上,这是一件相当简单的事情. 该库已经带有一个ServletCont ...

  5. 在MySQL数据库上使用Quartz Scheduler入门

    这是一些简单的步骤,可帮助您使用Groovy在MySQL数据库上完全入门Quartz Scheduler. 以下脚本可让您使用外部文件快速尝试不同的Quartz配置设置. 第一步是使用表设置数据库. ...

  6. 在java中使用quartz_如何在Java中使用Quartz Scheduler框架运行cron作业?

    我在Java中使用Quartz Scheduler来运行cron作业 . 这是我第一次使用这个框架来运行cron作业,所以我有些困惑 . 我正在关注这个tutorial以更好地理解如何使用Quartz ...

  7. java quartz Scheduler 操作Trigger

    一个JobDetail可以有多个Trigger //增 sched.scheduleJob(trigger);//trigger必须使用forJob绑定JobDetail //查 System.out ...

  8. java quartz Scheduler 操作JobDetail

    scheduler可以看成是一个容器,对JobDetail进行增删改查 //增 sched.addJob(job,false);// false表示不替换,ture表示替换,既更新;另外一般使用 比较 ...

  9. Quartz Scheduler

    SchedulerFactory & Scheduler & QuartzScheduler & QuartzSchedulerThread & ThreadExecu ...

最新文章

  1. matlab设计pss参考信号,[OAI][Layer1]PSS/SSS procedure
  2. VTK:相互作用之CallData
  3. 为了多拿点补贴,马斯克甚至还当过“渣男”?
  4. 在RedHat中安装新字体
  5. 30万奖金等你拿!Apache Flink 极客挑战赛入门指南(附Demo)
  6. SegNet安装、训练、测试
  7. 南京大学软件学院考研计算机网络汇总
  8. 程序员:世界如此精彩何故钟情code
  9. 网关、开放平台如何设计appKey,appSecret,accessToken的生成和校验机制
  10. 【漏洞复现】ApacheShiro1.2.4反序列化漏洞复现(CVE-2016-4437)
  11. Delphi ActionList详解
  12. HTML网页设计:周杰伦网站
  13. 美术大拿经验谈:游戏美术不仅是美术
  14. FFmpeg4编程入门---视频篇
  15. 知乎7w阅读!Android彻底组件化方案实践方法!已整理成文档
  16. 灵活的VueJS输入控件可进行评级
  17. Linux开发工具实现C/C++编程
  18. 我的世界java版怎么进EC,我的世界中国版为什么进不去了 进不去了怎么办
  19. 冠珠瓷砖打造民族文化品牌,让中国陶成为中国潮
  20. 纸上谈兵: 算法与数据结构

热门文章

  1. 最小生成树——Prim(普利姆)算法
  2. FAT12中,如何定位大于一个扇区(512B)的文件内容
  3. selenium 4_Selenium4 Alpha –期望什么?
  4. stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端
  5. 海贼王为什么画风突变_什么是突变测试?
  6. adf开发_了解ADF生命周期中的ADF绑定
  7. spark wai_WAI-ARIA对自动完成小部件的支持
  8. jpa 实体映射视图_JPA教程:实体映射-第2部分
  9. java 并发线程_Java并发教程–线程之间的可见性
  10. optaplanner_OptaPlanner –具有真实道路距离的车辆路线