PCF 解决方案将 spring @Scheduled 作业限制为 运行 仅在云环境中的一个实例中

PCF solution to restrict a spring @Scheduled job to run only in one instance in cloud environment

我在 Pivotal Cloud Foundry (PCF) 中有一个 spring @Scheduled 作业,它可以在多个实例中 运行,但我只想在一个实例中将它限制为 运行在PCF云环境中。

PCF 是否为此提供任何开箱即用的解决方案,或者我们是否需要更改我们的代码?

任何建议都将有助于我实施它。

使这项工作起作用的一种方法是查看 INSTANCE_INDEXCF_INSTANCE_INDEX(它们相同)环境变量。这将具有您的应用程序实例的实例编号。它是从零开始的,所以它将是 0 到您拥有的应用程序实例数减一(例如:5 个 AI == 0-4)。

有多种方法可以在您的应用程序中实现此功能,但高层次的想法是您选择一个索引号并进行设置,以便仅在该索引号上安排 运行s。零是你通常选择的,因为总是有第零个实例,但你可以 运行 它在任何索引上。

至于实现这一目标的方法:

  • 您的预定作业可以检查 env 变量,如果不是第 0 个索引,那么它就会成功完成。
  • 如果第 0 个索引上没有 运行ning,您可以禁用调度。
  • 您可以将调度配置包装在 Spring 配置文件中,并且只在第 0 个索引上启用该配置文件。
  • 您可以使用 @Conditional 并创建一个自定义 org.springframework.context.annotation.Condition 来检查环境变量索引。

我相信还有其他选择。这些只是我头脑中的那些。

希望对您有所帮助!

我有两种解决方法 1) set instances : 1 in manifest.yml,强制我们的应用在 cloud foundry 的一个实例中 运行。 2) 使用 cf 运行-task ,这样它只创建一个容器,运行 你的应用程序,然后在完成后销毁应用程序。

请分享您对 it.Thanks

的看法