Quartz2.2.x官方文档2.2.X—第三章 10.配置,资源使用和SchedulerFactory

Quartz 教程


Table of Contents | ‹ Lesson 9 | Lesson 11 ›

Lesson 10: 配置, 资源使用和SchedulerFactory

Quartz架构是模块化的,因此要运行需要几个组件组合起来。幸运的是,有一些帮手存在。

在Quartz能够工作之前有些重要的组件需要配置:

  • ThreadPool
  • JobStore
  • DataSources (如果必要的话)
  • The Scheduler itself

ThreadPool 提供一组当执行任务时Quartz使用的线程。池中线程越多,就能够同时执行越多的任务。然后,太多的线程会导致你的系统崩溃。大多数Quartz用户发现5个左右线程是足够的 -因为他们在任何时候都会有小于100任务,这些任务通常不会同时运行,而且这些任务通常是短暂的(完成快速的). 有些用户发现他们需要10,15,50,设置100个线程 - 因为他们有成千上万的各种各样的触发器 - 在任何时间都有平均10-100个任务要执行。你的调度程序池使用正确的数量完全取决于你的调度任务是怎么样。没有真正的规则, 除了保持线程数尽可能小之外(为了你机器资源考虑) - 但是确保你有足够的时间让你的任务触发。主要如果一个触发器的触发时间到了,但是没有一个可获得的线程,Quartz将会阻塞(暂停)知道线程可获取,接着任务将会执行 -比它应有段时间后几毫秒。这可能导致线程错误 - 如果在调度程序配置的"错误阀值"时间内没有可用线程。

线程池接在org.quartz.spi包内定义,你可以以任何你喜欢的方式是实现线程池。Quartz附带一个简单(但是非常有用)线程池名为org.quartz.simpl.SimpleThreadPool. 这个线程池只是会维护一组固定的线程池 - 永远不会减少,永远不会增加。但是它非常强东并且经受的主考验 - 几乎每个使用Quartz的人都使用这个池。

JobStoresDataSources 在教程课程9进行了讨论。这是值得注意,所有JobStores都需要是实现 org.quartz.spi.JobStore 接口 - and 如果一个捆绑的JobStores不是你需要的, 然后你可以自己做。

最后, 你需要创建一个 Scheduler 实例. 调度程序本身需要一个名字, 告诉它RMI设置,并且提供一个JobStore和ThreadPol。RMI设置包括是否应该将调度程序创建自身为RMI服务对象 (使其可用于获取远程连接),  要使用的host和端口, 例如.. StdSchedulerFactory (在下面讨论) 也可以创产生调度程序实例的实际代理通过远程去创建调度程序。

StdSchedulerFactory

StdSchedulerFactory是一个org.quartz.SchedulerFactory接口的是吸纳。它使用一系列属性 (java.util.Properties)去创建和初始化一个Quartz调度程序。这些属性通常存储在文件中并从文件中加载,但是也可以由你的应用直接创建。简单的在工厂调用getScheduler()方法生成调度程序,并初始化(包括它的线程池,JobStore和数据库资源), 返回一个公共接口的引用。

在Qaurtz发行版目录"docs/config"中有一些样例配置(包含对属性的描述)。你可以在Quartz文档的参考部分找到完整文档。

DirectSchedulerFactory

DirectSchedulerFactory是另一个SchedulerFactory的实现。对于希望以更程序化的方式创建调度程序的实例的这很有帮助。由于以下原因通常不要使用它:(1) 它要求用户对它所做的事情有深入的了解 (2) 它不允许声明式配置 - 或者换句话说, 你最终会硬编码所有调度程序设置。

Logging

Quartz使用SLF4J框架满足它的日志需要。为了调整日志设置 (比如产出数量, 输出的位置), 你不需要理解 SLF4J 框架, 这超出了本文的范畴。

如果你想要获得关于触发器和任务执行的额外信息,你可以启用org.quartz.plugins.history.LoggingJobHistoryPluginorg.quartz.plugins.history.LoggingTriggerHistoryPlugin.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章