如何避免这种情况?

时间:2012-10-03 13:21:07

标签: java quartz-scheduler jobs

我有一台相同的软件,在2台服务器上运行。这个软件中的每一个都运行Quartz,在特定时间午餐执行一项工作。 假设两个服务器都有时钟同步,这两个作业将在同一时间开始做同样的事情...... 我怎么能只运行一个工作而另一个工作不运行?

我也有一个数据库,我的第一个想法是创建一个表,在作业开始时插入一行,并验证当天是否有记录(如果是,则跳过作业执行...) 但同样,如果服务器上的时钟完全同步,那么两个应用程序将同时写入和检查,从而使这种机制无用。

我可以实施哪些其他解决方案?

1 个答案:

答案 0 :(得分:2)

Cluster 'em!

Quartz cluster http://quartz-scheduler.org/images/documentation/2.x/quartz_cluster.png

基本上,两个Quartz调度程序都使用相同的数据库进行同步,并且只在一台(空闲)计算机上运行作业。

  

但同样,如果服务器上的时钟完全同步,那么两个应用程序将同时进行写入和检查,从而使这种机制变得毫无用处。

这正是Quartz所做的!但是它使用一些数据库锁定/事务机制,以便当一个实例获取新作业时,第二个必须等待。


  

假设两台服务器都有时钟同步

他们必须具有同步时钟才能在群集中运行:

  

永远不要在不同的计算机上运行群集,除非使用某种形式的时间同步服务同步其时钟