四. 运行 Quartz 集群节点
在启动集群中的 Quartz 应用真的没什么差别。每个实例(或节点) 必须单独启动。启动时,实例连接到数据库,获取 Scheduler 信息,并开始部署 Job。
因为 Quartz 使用了一个随机的负载均衡算法,你将会看到 Job 以随机的行方式由不同的实例执行。没有固定的模式或预告定义的节点来执行特定的 Job。
下一节会讨论一些在处理集群环境中的 Quartz 较常见的问题和任务。
五. Quartz 集群 Cookbook
本节旨在为开发者便于解决 Quartz 集群的具体问题而提供了资源。
·指派 Job 给集群中特定的实例
当前,还不存在一个方法来指派(钉住) 一个 Job 到集群中特定的节点。假如你需要这种行为,你可以创建一个非集群的 Quartz 应用与集群中的节点并行运行,并且要使用独立的一套数据库表或单独的 JobInitializationPlugin 用到的 XML 文件。
不要让非集群的实例指向到集群所用的同一套数据库表。不然你会得到莫名其妙的结果。
·在集群中的每一个节点上运行 Job
正如前面所回答的,当前还没有一种方式能让某一个 Job 实例在集群中的每一个节点上都运行。最好的办法是使用一个非集群的实例与集群的每一个节点并行运行,并且要使用独立的一套数据库表或单独的 JobInitializationPlugin 和 RAMJobStore 用到的 XML 文件。
·在不同的机器上运行节点
Quartz 实际并不关心你是在相同的还是不同的机器上运行节点。当集群是放置在不同的机器上时,通常称之为水平集群。节点是跑在同一台机器是,称之为垂直集群。对于垂直集群,存在着单点故障的问题。这对高可用性的应用来说是个坏消息,因为一旦机器崩溃了,所有的节点也就被有效的终止了。
·使用时间同步服务
当你在是在不同的机器上运行 Quartz 集群时,时钟应当要同步,以免出现离奇且不可预知的行为。我们已经提及过,假如时钟没能够同步,Scheduler 实例将对其他节点的状态产生混乱。有几种简单的方法来保证时钟何持同步,而且也没有理由不这么做。
最简单的同步计算机时钟的方式是使用某一个 Internet 时间服务器(Internet Time Server ITS)。关于如何基于其中一个国际可接受标准来设置你的时钟的信息请看 http://tf.nist.gov/service/its.html。
·从集群获取正在执行的 Job 列表
当前,如果不直接进到数据库的话,还没有一个简单的方式来得到集群中所有正在执行的 Job 列表。如果你请求一个 Scheduler 实例,你将只能得到在那个实例上正运行 Job 的列表。你可以写一些访问数据库 JDBC 代码来从适当的表中获取信息。当然,这是用的 Quartz 之外的方法,但确是能解决问题的。另一个途是使用 Quartz 的 RMI 特性来依次连接到每一个节点,并从中查询到当前正在执行的 Job。
·让集群和非集群实例一起运行
没什么会阻止你在相同环境中使用集群的和非集群的 Quartz 应用。唯一要注意的是这两个环境不要混用在相同的数据库中(译者 Unmi 注:应用是数据库表)。意思是非集群环境不要使用与集群应用相同的一套数据库表;否则将得到希奇古怪的结果,集群和非集群的 Job 都会遇到问题。
假如你让一个非集群的 Quartz 应用与集群节点并行着运行,设法使用 JobInitializationPlugin(随之的 XML 文件) 和 RAMJobStore。这会让你的生活更轻松。
·在集群环境中使用全局监听器
你仍然可以使用 Job 和 Trigger 监听器在集群环境中。唯一能让你有所迷惑的是要努力理解哪个 Scheduler 实例将收到方法回调。
要记住这个最简单的方法是:Job 或 Trigger 是在哪个 Scheduler 实例上执行的,通知的就是这个 Scheduler 实例上的监听器。因为 Job 和 Trigger 只会在单个节点上执行,也就只会通知那个节点上的监听器。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-11-4/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
不错,正在学习,谢谢分享!
最简单的同步计算机时钟的方式是使用某一个 Internet 时间服务器(Internet Time Server ITS)。关于如何基于其中一个国际可接受标准来设置你的时钟的信息请看 http://tf.nist.gov/service/its.html。
网址打不开呀!急
一般企业中会把一台能出去的机器定时与某一 Internet 时间服务器同步,然后内部机器保持与上面那台机器保持时间同步。因为所有类型的集群中节点的时钟也是要同步的,而且应用服务器和数据库服务器也是要保持同步的。
谢谢分享