Roberto Asked:2020-11-01 00:23:06 +0000 UTC2020-11-01 00:23:06 +0000 UTC 2020-11-01 00:23:06 +0000 UTC @Scheduled spring 注解在带有负载均衡器的多节点环境中表现如何? 772 spring+java+websphere上的应用 有一个方法用@Scheduled 注解标记并且每天安排一次(执行与数据库的工作) 该应用程序部署在 WebSphere 上的多个节点上。它们由平衡器控制。我了解所有节点都使用一个数据库,是否会因为此任务已在多个节点上启动而出现问题? java 2 个回答 Voted talex 2020-11-01T01:45:14Z2020-11-01T01:45:14Z 问题可以而且可能会。 原因是所有节点都会同时执行这个方法。 Best Answer Темка тоже 2020-11-01T20:19:49Z2020-11-01T20:19:49Z 实际上,在一个简单的情况下,每个节点都将根据自己的调度程序工作。这充满了严重的问题,包括种族/数据锁定。有很多解决方案。其中最简单的,在节点的配置中,很难使其中一个节点成为调度程序唯一可以工作的节点。例如,这可以使用弹簧配置文件来完成: @Component @Profile("nodeWithScheduler") public class ProdJob { @Scheduled(cron = "${job.cron}") public void runJob() { } } 接下来,将 JVM 参数添加到其中一个节点的参数中-Dspring.profiles.active=nodeWithScheduler。然而,这个解决方案不是容错的,因为 如果指定节点发生故障,此调度程序将不会自动开始在另一个节点上运行。 如果您需要一个故障转移集群,那么您应该考虑使用Hazelcast或Ignite等实用程序。好吧,或者在最简单的情况下,使用可以通过数据库执行集群锁定的实用程序。例如ShedLock或Quartz附加组件。 PS我用英文版的Ignite解决了一个类似的问题。见问题。那里也有答案。
问题可以而且可能会。
原因是所有节点都会同时执行这个方法。
实际上,在一个简单的情况下,每个节点都将根据自己的调度程序工作。这充满了严重的问题,包括种族/数据锁定。有很多解决方案。其中最简单的,在节点的配置中,很难使其中一个节点成为调度程序唯一可以工作的节点。例如,这可以使用弹簧配置文件来完成:
接下来,将 JVM 参数添加到其中一个节点的参数中
-Dspring.profiles.active=nodeWithScheduler。然而,这个解决方案不是容错的,因为 如果指定节点发生故障,此调度程序将不会自动开始在另一个节点上运行。如果您需要一个故障转移集群,那么您应该考虑使用Hazelcast或Ignite等实用程序。好吧,或者在最简单的情况下,使用可以通过数据库执行集群锁定的实用程序。例如ShedLock或Quartz附加组件。
PS我用英文版的Ignite解决了一个类似的问题。见问题。那里也有答案。