从 control-m 启动 spring 个批处理作业

Launch spring batch jobs from control-m

我在 Spring 批处理中开发了作业,以取代以前使用 bash 脚本完成的数据加载过程。

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

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

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

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

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

The safe approach seems to be to package the spring batch application as a jar and trigger from control-m the job using "java -jar", but this doesn't seem the right way considering we have 20+ jobs.

IMO,运行按需创建作业是可行的方法,因为这是使用资源的最有效方式。拥有 JVM 运行ning 24/7 并使其 运行 一次成为批处理作业是一种资源浪费,因为 JVM 将在 运行 计划之间空闲。如果您关心的是事物的打包方面,您可以将所有作业打包在一个 jar 中,并在启动时使用 spring 引导 属性 spring.batch.job.names 指定要 运行.

I was wondering if it's possible to trigger the app once (like a deamon) and communicate with it using JMS or any other approach. In this way we wouldn't need to spawn multiple jvms (considering jobs might run simultaneously).

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

另一种方法是结合使用 Spring 批处理和 Spring 集成,以使用 JMS 请求 (JobLaunchRequest) 启动作业。 Launching Batch Jobs through Messages.

中的代码示例详细解释了这种方法

除了来自 Mahmoud 的有用答案之外,Control-M 对守护进程来说不是很好。当然,您 可以 启动守护进程,但是任何 运行 长时间(即数周或更长时间)都容易出错,并且您通常会以守护进程告终运行 Control-M 不再是 "aware" 的(例如,如果系统出现问题导致 Control-M 代理假定守护进程作业失败,然后启动另一个).

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