多个实例上的 Spring 和计划任务

标签 spring spring-boot jobs job-scheduling

我们有一个 Spring Boot 应用程序,并且有计划任务。

我们想在多台服务器上部署我们的应用程序,所以会有多个应用程序实例。

如何配置Spring只在指定的服务器上运行定时任务?

最佳答案

这是一个非常广泛的话题。有很多选择可以实现这一目标。

  • 您可以将应用程序配置为具有多个配置文件。例如,使用另一个配置文件 'cron' 。并且仅在具有此配置文件的一台服务器上启动您的应用程序。例如,在生产环境中,您有三台服务器(S1、S2、S3),然后您可以使用配置文件 prod 和 cron( -Dspring.profiles.active=prod,cron )在 S1 上运行。在 S2 和 S3 上只需使用 prod 配置文件( -Dspring.profiles.active=prod )。
    在代码中,您可以使用 @Profile("cron")在调度程序类上。这样它只会在 cron 配置文件处于事件状态时执行
  • 使用分布式锁。如果您的环境中有 Zookeeper,您可以使用它来实现分布式锁定系统。
  • 您可以使用一些数据库(mysql)并创建一个示例代码来锁定其中一个表并添加一个条目。并且无论哪个实例获得锁,都会在该数据库中创建一个条目并执行 cron 作业。你需要
    如果 getLock(),请检查您的代码成功后才继续执行。 Mysql 有像 LOCK TABLES 这样的工具,您可以使用它来摆脱并发读/写。

  • 我个人会说,选项 2 是最好的。

    关于多个实例上的 Spring 和计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49533543/

    相关文章:

    spring - 在 SSL CXF SOAP 客户端下访问 Web 服务

    java - Spring 启动: Multi-layered @Services in RESTful controllers for many inbound requests

    jobs - 如何在 Linux 上使用 libdrizzle 配置 gearmand?

    kubernetes - 更改 kubernetes 作业的图像

    java - 如何使用maven生成JAR

    spring - @enabler2dbcrepositories 无法找到我的存储库

    java - JWT 识别 token 类型(刷新或访问)

    java - 在组件构造函数上使用 `@Lazy` 等于注释每个参数吗?

    mongodb - Spring Boot无法找到我的模板 View ,发生意外错误(类型=未找到,状态= 404)

    php - Laravel 队列/重命名作业表