【问题标题】:Spring: how to lock the scheduler in one of several instances of the applicationSpring:如何将调度程序锁定在应用程序的几个实例之一中
【发布时间】:2021-01-26 01:30:18
【问题描述】:

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

【问题讨论】:

  • 两个实例都从同一个数据库中获取数据,这就是问题所在。为什么不能在本地复制它以用于开发目的?
  • 您可以通过不同的方式执行锁定,包括通过单独的数据库表进行锁定,但所有这些都只是棘手的解决方法。相反,您应该为两个实例使用单独的数据源。

标签: java spring scheduler multiple-instances


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多