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_INDEX
或 CF_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
的看法
我在 Pivotal Cloud Foundry (PCF) 中有一个 spring @Scheduled 作业,它可以在多个实例中 运行,但我只想在一个实例中将它限制为 运行在PCF云环境中。
PCF 是否为此提供任何开箱即用的解决方案,或者我们是否需要更改我们的代码?
任何建议都将有助于我实施它。
使这项工作起作用的一种方法是查看 INSTANCE_INDEX
或 CF_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
的看法