java - 如何将 CRON 任务设置为每组实例仅运行一次?

标签 java tomcat cron scheduled-tasks cluster-computing

我们在 AWS 中托管我们的网站。我们目前在一个集群中有 3 个 EC2 实例,使用 AWS 负载均衡器。

服务器有linux、apache、java、mysql、tomcat 6.0。

我们正在决定如何设置一个每小时运行一次的任务。执行此操作的明显位置是在 Java 代码中,但存在一个问题。

问题是因为我们在集群中有 3 个实例(都是相同的),任务将每小时运行 3 次,而不是每小时运行一次,每个实例运行一次。

我有一些想法来克服这个问题,但希望有一个更好的(可能是行业标准)来解决这个问题。

一个想法是将它已经运行的存储在数据库中。该任务将看到它今天是否已经运行。不过我在那里看到了错误。

另一个想法是在 Tomcat 的代码之外使用安装在 native 操作系统中的一个实例上的 cron。这将使用 wget 来调用调用 java 方法的网页。由于那只会调用其中一个实例,因此它应该只运行一次。

这两种方式看起来都像是 hack 并且容易出现错误。有真正的方法可以做到这一点吗?

最佳答案

我已经使用了 cron/wget 解决方案,它实际上是解决问题的合理方法。您的系统管理员会很高兴能够控制它。

另一种解决方案是使用 JVM 系统属性来指示您的哪个实例是运行作业的实例。例如:-DschedulerEnabled=true。仅在其中一个实例上设置该标志,并且仅在设置该标志时才运行作业调度代码。

最后,Quartz 通过它的 Clustering 支持您基于数据库的解决方案。特征。这样做的好处是它是一个真正的 HA 解决方案。对于其他解决方案,如果充当作业调度程序的机器出现故障,您必须手动故障转移到另一台机器。

关于java - 如何将 CRON 任务设置为每组实例仅运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988687/

相关文章:

java - 如何将 Vaadin 8 Grid 的高度设置为未定义?

java - 如何在从 jquery 发送 $.get 请求时启用 CORS?

python - 使用 python 确保长时间运行的进程只执行一个进程

java - 将应用程序上传到 Windows 10 应用商店

javascript - AngularJS(路由)在Eclipse中的Maven SpringBoot项目中找不到.html模板

tomcat - 在 tomcat 中,如何在服务器端启用 gzip 配置后默认返回没有 gzip 压缩的原始响应负载?

linux - 如何在每个月的第一个星期五运行cronjob?

shell - 如何限制shell脚本执行时间?

java - 异常不会影响方法声明吗?

java - 获取方法 url 在文件名(源)之前包含 %E2%81%A9,为什么?