有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java避免OLTP上的Spring批处理作业

我们在Spring中编写了一个REST API。该应用程序的一部分是每天运行的Spring批处理作业。我希望在Spring批处理作业完成后,将退出代码返回到启动应用程序的shell脚本,因此我在main方法中添加了System.exit()。直到那时我才意识到这会导致整个Spring引导应用程序退出,这是我们不希望看到的。我正在寻找一种执行Spring批处理作业的方法,向调用它的shell脚本返回一个退出代码,并使Spring启动应用程序仍处于运行状态

我知道我可以将Spring批处理作业安排在特定时间运行,作为正在运行的Spring引导应用程序的一部分,并且它将在整个应用程序启动时运行。但问题是,应用程序在OLTP上运行,我们不能让Spring批处理作业在OLTP上运行,因为这会试图同时在多个OLTP服务器上执行相同的作业,从而导致某些作业实例失败

出于上述原因,我们希望在OLTP和单个批处理服务器上运行应用程序。我们的目标是,Spring批处理作业将通过批处理服务器运行,并且应用程序将以该批处理服务器上的System.exit()结束(以便它可以向shell脚本返回退出代码),而实际的Spring引导应用程序将通过OLTP可用,并且不会有System.exit()语句。我不明白这是怎么可能的,但如果所有这些对其他人来说都有意义的话,我很想听听他们的意见


共 (2) 个答案

  1. # 1 楼答案

    Our aim is that the Spring Batch jobs will run through the batch server, and the application will end with a System.exit()

    伙计,这本身是不可能的。如果希望批处理作业通过shell子进程运行并读取进程退出代码,请不要使用spring批处理。这并不意味着什么。SpringBatch用于通过SpringBatch作业处理具有重试逻辑的许多记录,并提供一个框架/设计模式,用于读取记录,然后将其写入另一个源

    所以,伙计,只需将正在批处理的java逻辑提取到一个简单的spring boot应用程序中。可能将其作为一个jar文件包含,REST处理程序和独立的springboot应用程序都使用该文件。看起来您真正是在通过shell脚本而不是spring批处理来管理作业

  2. # 2 楼答案

    分离批处理逻辑。这似乎是个很糟糕的主意。为不同的功能创建单独的弹簧护套

    如果你坚持要把它们放在一起,那就用旗标驱动的方法。在共享存储库中保留作业活动标志,在启动作业之前,检查是否有其他实例启动了作业。您还可以为作业命名,并让Spring批处理多次提交作业