3

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

但是阅读文档 [1],我得出的结论是,我必须使用一个triggertask(源),然后将一个(源)发送TaskLaunchRequest到一个tasklauncher(接收器)以最终启动新进程。

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

  • 流服务器
  • 触发任务(来源)
  • 任务启动器(接收器)

好的,流服务器和任务启动器将为任何即将到来的任务共享,但 triggertask 只能为单个任务获取 cron 定义,因此必须为任何即将到来的任务定义进行复制。所以我每个任务至少需要一个“保姆流程”?

真的???这听起来像是一个巨大的矫枉过正......从我的角度来看,我希望 cron 调度是任务定义的核心功能,所以唯一需要的是流服务器。

我理解这个正确还是我错过了什么?在 Spring Cloud 环境中是否有更简单的方法可以做到这一点?我真的很喜欢让流服务器在需要时启动新的 JVM 的想法,但是所有这些额外的过程确实感觉是错误的方法。

如果这应该在 CloudFoundry 上运行,例如http://run.pivotal.io那么这意味着我有一个 cron 调度程序用于单个作业,成本为 35 美元/月(因为从 Java BuildPack 4.0 开始,只有 512MB 的 JVM 进程将不再启动 [ 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/

4

1 回答 1

3

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

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

当 Spring Cloud Task 项目启动时,我们想要创建一些示例应用程序来说明许多不同用例中的任务用法。能够根据收到的消息轻松启动任务是我们确定的一个用于创建样本的用例。您可以在此处此处查看该示例。

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

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

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

于 2017-07-18T15:40:31.287 回答