我们将网站托管在AWS中。当前,我们使用AWS负载均衡器在一个集群中拥有3个EC2实例。
这些服务器具有linux,apache,java,mysql和tomcat 6.0。
我们正在决定如何设置一个每小时运行的任务。显而易见的地方是在Java代码中,但是有一个问题。
问题在于,由于集群中有3个实例(所有实例都是相同的),因此该任务将每小时运行3次,而不是每小时一次,每个实例一次。
我有一些想法可以解决这个问题,但我希望在管理方面有更好的(可能是行业标准)。
一种想法是将已经运行的数据存储在数据库中。该任务将看到它是否已经运行了。我在那里看到了错误。
另一个想法是使用安装在 native OS中实例之一上的cron,而不是Tomcat中的代码。这将使用wget调用一个调用java方法的网页。由于那只会调用其中一个实例,因此它只能运行一次。
两种方式都似乎很容易被破解,并且容易出错。有真正的方法吗?
最佳答案
我使用了cron/wget解决方案,这实际上是解决问题的一种合理方法。您的系统管理员将很高兴能够对其进行控制。
另一种解决方案是使用JVM系统属性来指示运行作业的实例是哪个实例。例如:-DschedulerEnabled=true
。仅在实例之一上设置该标志,并且仅在设置了该标志的情况下才运行作业调度代码。
最后,Quartz的Clustering功能支持您的基于数据库的解决方案。这样做的好处是它确实是一个HA解决方案。使用其他解决方案时,如果充当作业调度程序的计算机出现故障,则必须手动故障转移到另一台计算机。
关于java - 如何将CRON任务设置为每组实例仅运行一次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7988687/