Spring:如何在应用程序的多个实例之一中锁定调度程序

问题描述

我的应用程序有一个调度程序,它每 10 秒从数据库请求一次数据并进行处理。我可以运行 2 个应用程序实例:第一个是持续运行的开发服务器,第二个是我的本地服务器。两个实例都从同一个数据库获取数据。问题是当我在本地进行编辑并想要测试它们时,因为开发服务器正在运行,它可以在本地服务器之前拦截和处理我的数据。这种情况可能发生多次,非常令人不安。有什么办法可以让我的本地实例在调度程序中执行任务,而开发服务器只是跳过它?我的意思是我需要我的本地调度程序每 10 秒按计划运行一次,而开发服务器上的调度程序在我的本地实例运行时跳过了该任务。是否有可能?或者有图书馆吗?

解决方法

对此有许多可能的解决方案。 “最干净”的方法是将数据库分开,这样您的本地应用程序根本不会连接到开发服务器的数据库,而是会维护一些在本地运行的数据库。

另一种可能的解决方案是重构计划作业,使其仅在某种自定义配置上运行,以便在开发配置文件(您可能在代码中使用 spring 配置文件或“条件”)上,调度程序根本不会运行。在开发服务器上,此配置将默认启用,调度将照常运行。

,

作为例子,你可以使用这个

    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-spring</artifactId>
    </dependency>
    <dependency>
        <groupId>net.javacrumbs.shedlock</groupId>
        <artifactId>shedlock-provider-jdbc-template</artifactId>
    </dependency>