每个Spring云任务触发器需要一个JVM进程吗?

时间:2017-07-14 12:48:01

标签: spring cloudfoundry spring-cloud spring-cloud-stream spring-cloud-task

我们有许多批处理作业,现在通过单个应用程序中的cron表达式进行调度。我们希望更多地隔离这些工作,从而将它们转移到Spring云任务。

但是阅读文档[1]后,我得出结论,我必须使用triggertask(来源),然后将TaskLaunchRequest发送到tasklauncher(接收器)最终推出新流程。

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

  • flow server
  • triggertask(来源)
  • tasklauncher(接收器)

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

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

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

如果这应该在CloudFoundry上运行,例如http://run.pivotal.io那么这意味着我有一个cron调度程序用于单个作业,花费我的35 $ / Mth(因为来自Java BuildPack 4.0 JVM进程只有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/

1 个答案:

答案 0 :(得分:3)

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

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

当Spring Cloud Task项目启动时,我们想要创建许多示例应用程序,以说明在许多不同用例中的任务使用情况。能够轻松启动任务以响应正在接收的消息是我们确定的用于创建样本的一个用例。您可以看到该示例herehere

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

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

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