我有一个第三方linux应用程序,该应用程序必须在主Spring Boot应用程序运行之前运行并完成。 我已经阅读了有关工作者应用程序和一次性任务的信息,但是目前我不知道用例属于哪一类。 linux应用程序某种程度上依赖于主应用程序,所以我认为我需要一个一次性任务(带有运行任务)。
同时,Linux应用程序必须在启动主应用程序之前完成。 如果我的假设是正确的,我将很高兴知道如何在启动主应用程序之前确定linux应用程序已经完成。 另一方面,我想知道如何在Cloud Foundry上推送linux应用程序,以防我需要将其视为辅助应用程序。
工作者是一种基于相同代码库运行多个OS进程的方法。 例如,如果您有一个Web应用程序,并且除了Web部件之外,它还具有一个后台进程,该进程可能处理长时间运行的作业或类似的工作。 Web和工作进程都将设计为同时运行并永远运行(即永远不会退出,如果退出则是崩溃)。
基于同一代码分支的任务不能与主应用程序并行运行。 它将运行一段时间并退出。 经典示例用于批处理和单次运行作业,例如,如果您有一组需要处理的记录,则当这些记录完成时,任务将退出(这是预期的,并且不会崩溃)。 任务通常与调度程序结合使用,并且一次又一次地运行。
哪一种都不是您要尝试做的事情的理想选择。 您可以使用任务,但是您需要手动管理任务并使它在应用程序启动之前运行。 您可以使用Shell脚本和cf cli来执行此操作,例如:使用--no-start
推送您的应用程序,运行任务,等待其完成,然后cf start
您的应用程序。
您可以做的其他几件事:
将.profile
脚本与您的应用程序打包在一起 。 这将在与您的应用程序相同的容器中执行,但在应用程序运行之前。 除非脚本成功完成,否则应用程序将无法启动。 这几乎就是您想要的内容,但是它有一个严重的局限性,因为您只有很少的时间来完成.profile
脚本(默认值为60s,在大多数平台上最多为180s,基本上是cf push -t
)。 如果尚未完成足够快的时间,则认为您的应用尚未启动,因此将重新启动。 这也将在您的应用每次启动时在每个应用实例中运行,而这可能并不是您想要的。 最后一件事,文档说您不能在Java应用程序中使用它,但是它们是错误的,只是更复杂)。
修改您的启动命令(即cf push -c
)。 该基本与.profile
相同,只是您在启动命令中放入了多个命令,例如cf push -c 'do_something_1 && do_something_2 && do_something_3 ...'
)。 此选项与.profile
选项具有相似的限制,此外,它与Java buildpack配合使用也不好,该Java buildpack具有相当长且复杂的启动命令(请勿对Java应用程序使用此选项)。
希望有帮助!