【问题标题】:Launch spring batch jobs from control-m从 control-m 启动 spring 批处理作业
【发布时间】:2019-08-11 08:35:57
【问题描述】:

我在 Spring Batch 中开发了作业,以替换以前使用 bash 脚本完成的数据加载过程。

我公司选择的调度程序是 control-m。旧的 bash 脚本是在文件到达时使用文件观察程序从 control-m 触发的。

由于我无法控制的原因,我们仍然需要使用 control-m。不可能使用 Spring Boot 或任何其他绑定到 Web 服务器的框架。

安全的方法似乎是将 spring 批处理应用程序打包为 jar 并使用“java -jar”从 control-m 触发作业,但考虑到我们有 20 多个作业,这似乎不是正确的方法。

我想知道是否可以触发应用程序一次(如守护程序)并使用 JMS 或任何其他方法与其通信。通过这种方式,我们不需要生成多个 jvm(考虑到作业可能同时运行)。

我愿意接受不同的解决方案。随时教我解决此用例的最佳方法。

【问题讨论】:

    标签: java spring jms spring-batch control-m


    【解决方案1】:

    安全的方法似乎是将 spring 批处理应用程序打包为 jar 并使用“java -jar”从 control-m 触发作业,但考虑到我们有 20 多个作业,这似乎不是正确的方法。

    IMO,按需运行作业是可行的方法,因为它是使用资源的最有效方式。让 JVM 24/7 运行并让它偶尔运行一次批处理作业是一种资源浪费,因为 JVM 在运行计划之间将处于空闲状态。如果您关心的是打包方面的问题,您可以将所有作业打包在一个 jar 中,并在启动时使用 spring boot 属性spring.batch.job.names 来指定要运行的作业。

    我想知道是否可以触发应用程序一次(如守护程序)并使用 JMS 或任何其他方法与其通信。这样我们就不需要生成多个 jvm(考虑到作业可能同时运行)。

    我建议在您的 JVM 中公开一个 REST 端点并实现一个控制器来按需启动批处理作业。您可以在Running Jobs from within a Web Container 部分找到一个示例。在这种情况下,作业名称及其参数可以作为请求参数传入。

    另一种方法是结合使用 Spring Batch 和 Spring Integration 来使用 JMS 请求 (JobLaunchRequest) 启动作业。此方法在Launching Batch Jobs through Messages 中的代码示例中进行了详细说明。

    【讨论】:

      【解决方案2】:

      除了来自 Mahmoud 的有用回答之外,Control-M 对守护进程也不是很好。当然,您可以启动一个守护进程,但是任何运行相当长的时间(即几周甚至更长时间)的东西都容易出错,并且您通常会遇到运行该 Control-M 的守护进程不再“意识到”(例如,如果系统有问题导致 Control-M 代理假定守护程序作业失败,然后启动另一个)。

      当我没有其他可用的方法时,我曾经在 Control-M 中将守护进程添加为批处理作业,但在检查多个守护进程、停止/启动和各种内务任务的额外作业中存在开销。如果可能,最好避免。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-09
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        相关资源
        最近更新 更多