我们有一个用Spring Boot编写的REST API。此应用程序的一部分是每天运行的Spring Batch作业。我想在Spring Batch作业完成后将退出代码返回到启动应用程序的shell脚本,所以我在main方法中添加了System.exit()
。只有这样我才意识到这会导致整个Spring Boot应用程序退出,这是我们不想要的。我正在寻找一种方法来执行Spring Batch作业,将退出代码返回到调用它的shell脚本,并使Spring Boot应用程序仍然运行。
我知道我可以将Spring Batch作业安排在特定时间运行,作为正在运行的Spring Boot应用程序的一部分,它将在整个应用程序启动时运行。但问题是应用程序在OLTP上运行,我们不能在OLTP上运行Spring Batch作业,因为它会尝试同时在多个OLTP服务器上执行相同的作业,从而导致某些作业实例失败。
由于上述原因,我们希望在OLTP和单个批处理服务器上运行该应用程序。我们的目标是Spring Batch作业将通过批处理服务器运行,应用程序将在此批处理服务器上以System.exit()
结束(以便它可以将退出代码返回到shell脚本),而实际的Spring引导应用程序将通过OLTP提供,并且不会有System.exit()
语句。我不知道这是怎么可能的,但如果所有这些对其他人来说都是有意义的,我很乐意听取他们的意见。
答案 0 :(得分:2)
分离批处理逻辑。这似乎是一个非常糟糕的主意。为不同的功能创建单独的弹簧靴。
如果你坚持要把它们放在一起,那就做一个标记驱动的方法。在共享存储库中保留作业活动标志,并在启动作业之前,检查是否有其他实例启动了该作业。您还可以为作业命名,让Spring Batch多次提交作业。
答案 1 :(得分:2)
我们的目标是Spring Batch作业将通过批处理服务器运行,应用程序将以System.exit()结束
伙计,这本身是不可能的。如果希望批处理作业通过shell子进程运行并读取进程退出代码,请不要使用spring批处理。这不是那个意思。 Spring批处理用于通过弹簧批处理作业处理许多具有重试逻辑的记录,并为读取记录提供框架/设计模式,然后将它们写入另一个源。
所以,老兄,只需将正在批处理的java逻辑解压缩到一个简单的spring-boot应用程序中。可能包含它作为一个jar文件,由REST处理程序和独立的springboot应用程序使用。您似乎真正从shell脚本管理作业,而不是Spring-batch。