每个 spring 云任务触发器是否需要一个 JVM 进程?

do I need one JVM process for each spring cloud tasktrigger?

我们有许多批处理作业,如今这些作业是通过单个应用程序中的 cron 表达式安排的。我们希望更多地隔离这些作业,因此将它们移至 spring 云任务。

但是阅读文档 [1],我得出的结论是我必须使用 triggertask(来源),它又将 TaskLaunchRequest 发送到 tasklauncher( sink) 以最终启动新进程。

这意味着(如果我只有一个 task/batch)我至少需​​要以下 JVM 进程 运行 触发一个新进程:

好的,流服务器和任务启动器将为任何即将到来的任务共享,但 triggertask 只能为单个任务采用 cron 定义,因此必须为任何即将到来的任务定义进行复制。所以每个任务我至少需要一个"nanny process"?

真的吗???这听起来有点矫枉过正......从我的角度来看,我本以为 cron 调度是任务定义的核心功能,所以唯一需要的就是流服务器。

我的理解是否正确,或者我是否遗漏了什么?在 spring 云环境中有更简单的方法吗?我真的很喜欢让流服务器在需要时启动新 JVM 的想法,但所有这些额外的过程真的感觉是错误的方法。

如果这应该 运行 在 CloudFoundry 上,例如http://run.pivotal.io 然后这意味着我有一个 cron 调度程序用于单个作业,成本为 35 美元/月(因为从 Java BuildPack 4.0 JVM Process 只有 512MB 将不再启动 [2]) - 这是一个昂贵的cron 定义...

[1] https://github.com/spring-cloud/spring-cloud-stream-app-starters/tree/master/triggertask/spring-cloud-starter-stream-source-triggertask [2] https://www.cloudfoundry.org/just-released-java-buildpack-4-0/

TL;DR; 不要那样做,要么编写自己的调度逻辑,要么将 Spring Cloud Data Flow 的 REST API 与您的企业集成调度程序。

长版
让我先介绍一下这方面的历史,然后谈谈我的想法。

当 Spring Cloud Task 项目启动时,我们想要创建一些示例应用程序来说明任务在许多不同用例中的使用情况。轻松启动任务以响应收到的消息的能力是我们确定要创建示例的一个用例。您可以看到示例 here and here.

当 Spring 云数据流 (SCDF) 出现时,我们希望能够以 某种 方式解决的用例之一是调度任务。问题是我们希望 SCDF 服务器是无状态的(因为它本身就是云原生微服务)。这意味着嵌入调度程序不是一种选择。从那里我们觉得与每个平台提供的调度集成最有意义。然而,它也需要最多的工作。这种方法实际上在我们的路线图上,但我们没有得到用户反馈来将该功能推到列表的更高位置。

我们在短期内解决此要求的解决方案就是您今天在文档中找到的解决方案。将这些示例应用程序与 trigger-task 应用程序结合使用,该应用程序处理拼图的 cron 部分以在给定时间启动任务。

我个人的建议是,如果您没有已经使用的调度程序,请编写一个使用 Quartz 或其他内部调度程序(Spring 调度程序等)的启动应用程序来调用 SCDF API 以给定的时间表启动任务。鉴于 DataFlowTemplate 可用,编写您自己的调度程序应该很简单。