【问题标题】:How to get the execution id of a restarted job in Spring Cloud Data Flow如何在 Spring Cloud Data Flow 中获取重新启动作业的执行 ID
【发布时间】:2020-06-30 22:17:53
【问题描述】:

我们创建了一个 Spring Batch 作业,通过 Spring Cloud Task(一个简单的任务,它只执行作业)在 Spring Cloud Data Flow 中执行。已使用 UI 和 REST API 检查了执行情况,在理想情况下一切正常。当我们尝试停止并重新启动作业时,问题就出现了。遵循 REST API 指南:

  1. 启动任务:https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-launching
  2. 使用上一点返回的任务执行id获取任务执行信息:https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-detail
  3. 这是第一个问题:如果我们停止具有任务执行 ID (https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-stopping) 的 任务,则与该任务关联的作业会停止执行(在日志中),但在 de 数据库中作业保持为“已开始”。然后不可能重新启动作业执行,因为它永远不会达到“已停止”状态 --> 对于 SCDF 专家......这不是错误还是技术原因?
  4. 如果我们要停止job,需要从第2点的response中获取jobExecutionIds第一个param,并以job execution id (https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-executions-stop)发出请求
  5. 等待适当的时间完成运行步骤执行,作业达到“已停止”状态。如果现在我们重新启动作业 (https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-executions-restart),则会创建一个新的任务执行,并与新的作业执行链接,并完成处理。

现在是百万美元的问题:如果我们想将 SCDF 与计划器(如 Control-M)集成,如果重启请求不返回任何执行 ID,我们如何发出轮询请求以检查重启后执行的状态?如果只是正常执行,我们可以发送与任务执行ID(步骤2)相关联的作业执行ID(步骤4)的轮询请求,但重启后我们是“盲目的”

【问题讨论】:

    标签: spring-boot spring-batch spring-cloud-dataflow spring-cloud-task


    【解决方案1】:

    好吧,我不知道是否有更直接的方法可以做到这一点,但这是与外部系统集成的可能解决方案:

    1. 启动任务:https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-launching 这将返回 任务执行 ID
    2. 恢复与上一个任务执行id关联的job execution idhttps://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-detail作业执行 ID 字段“executionId”
    3. 使用 作业执行 ID 停止执行(可选,它可能已因错误而完成):https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-executions-stop
    4. 使用 作业执行 ID 重新启动/恢复执行:https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-executions-restart
    5. 使用“旧”作业执行 ID 获取 作业实例 IDhttps://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-executions-detail job instance id是字段“jobId”
    6. 使用 作业实例 ID 获取“新”作业执行 IDhttps://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-job-instances-detail 其中“jobExecutions”字段是一个执行数组,其中第一个位置是最后一次执行,因此我们可以从“executionId”字段中获取新的job execution id李>

    【讨论】:

      【解决方案2】:

      这是第一个问题:如果我们停止任务执行 ID (https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#api-guide-resources-task-executions-stopping) 的任务,则与任务关联的作业会停止执行(在日志中),但在数据库中,作业保持为“已启动”。然后不可能重新启动作业执行,因为它永远不会达到“STOPPED”状态

      这看起来像一个错误,请随时通过https://github.com/spring-cloud/spring-cloud-dataflow/issues 报告它。报告时,请添加任何其他信息,例如 SCDF 服务器日志等,以便更好地调查。

      如果我们想将 SCDF 与计划器(如 Control-M)集成,如果重启请求未返回任何执行 ID,我们如何发出轮询请求以检查重启后执行的状态?如果只是正常执行,我们可以发送与任务执行id(步骤2)相关联的作业执行id(步骤4)的轮询请求,但重启后我们是“盲目的”

      SCDF 服务器公开 REST 端点以检查作业执行的状态。您可以点击服务器端点或使用 REST 客户端进行检查。有关 REST 客户端的更多信息,您可以查看 [这里].1

      【讨论】:

      • 您好 Ilayaperumal Gopinathan,感谢您的回答。我会在 GitHub 上报告这个问题。关于 Job Executions 的状态,我知道有端点可以获取执行信息,问题是我们无法提前知道执行 ID。启动请求返回可用于恢复信息的ID,但重新启动请求不返回任何内容。
      • 重新启动请求不返回执行 ID,因为它应该使用它尝试重新启动的相同作业执行 ID。不知道我是否误解了你的要求。
      • 在 Spring Batch 中,作业执行 ID 不能重复使用,每个执行(无论是开始还是重新启动)都有自己的 ID。另一件事是启动和重新启动之间常见的“作业实例 ID”。该参数为Job Execution Detail请求link返回的“jobId”字段。
      • 考虑到这一点,我意识到在 SCDF API 中还有另一个实例请求:link。有了它,就可以获取数据了(缺点是需要4个请求)
      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 2020-02-17
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多