我想知道Quartz如何确保集群中只有一个节点运行特定作业。我知道可以通过在quartz.properties中设置一些属性(例如JobStoreTX等)来完成,但是支持它的内部实现是什么?
答案 0 :(得分:1)
石英数据库中的集群是使用数据库完成的,因此,如果您的工作存储是JdbcJobStore,则将发生集群。
只有具有相同调度名称和不同instance_name的调度器才能参与并形成集群。
将使用1个ClusterManager线程来管理集群。该线程确保上次签入时间按设置的间隔进行更新。如果在该设置的间隔中存在任何不匹配,实例将被视为已关闭。
2 Quartz使用standardlocksemaphore进行石英实例的数据库级集群
StdRowLockSemaphore
在此类中,石英使用
对行进行悲观锁定select * from {}_Lock for update
如果在完成触发触发器后检查JobStoreSupport类,则将通过完成事务来释放行锁。 因此,如果两个调度程序实例将针对同一触发器完成,那么只有一个能够成功。
希望这可以帮助您连接点。