为什么要使用 Spring Batch Jobrepository?

Kay*_*Kay 1 spring spring-batch

我了解 JobRepository 用于作业状态的 CRUD 操作。我正在使用持久性数据库,JobRepository 会在数据库中保留历史元数据还是只存储当前正在运行的进程?

另外,如果我有一系列由作业调度程序执行的作业,并且每个作业都有自己的 JobRepository 数据库,它们会共享相同的持久表还是我必须为每个 JobRepository 创建不同的数据库?

Jil*_*urp 8

运行 spring 批处理需要作业存储库,但它是需要一些工作才能实际交付任何值的事情之一(例如设置 spring 批处理管理或编写自己的用户界面)。实际上,在我见过的大多数使用 Spring Batch 的项目中,作业存储库纯粹是一个只写的东西,往往会被完全忽略。你必须拥有它,没有人看过它。使用 sql 客户端在表中挖掘以查找带有错误、警告和堆栈跟踪的日志,如果您正确设置日志记录并且正确执行日志记录是任何严肃的服务器端业务的硬性要求。

恕我直言,考虑到它增加了很多复杂性,使作业存储库可选将是一件好事。大多数项目根本不需要它。并且大多数确实需要它的项目(例如多节点批处理集群)也应该考虑其他实际上旨在提供跨集群状态管理的技术(例如 Zookeeper)。此外,在这一点上,您最好查看 Spring Cloud、hadoop 或类似解决方案之类的东西。Spring批处理是实现这些解决方案的垫脚石。

需要注意的一些事项:

  • Spring Batch 将在与生产数据库不同的位置创建和填充您可能需要的信息的表。
  • 如果您最终在生产数据库中使用 spring 批处理表(例如,因为为您根本不关心的表配置额外的数据库会矫枉过正),您可能希望确保这些表是您的数据库迁移的一部分脚本。
  • 您可能还需要考虑定期清理这些表中积累的数据,特别是如果您从未真正对这些数据进行任何操作。
  • 默认作业只能运行一次,您实际上必须将它们配置为能够运行多次。它实际上存储在它已经运行的作业存储库中,默认情况下,如果您第二次运行某些东西,它什么也不做。这个“功能”多次让我感到惊讶。解决方案是.incrementer(new RunIdIncrementer())在您的作业中添加一个。
  • Spring Batch 假设您的作业和步骤将分布在一个集群中(即使对于大多数项目来说这永远不会是一件事情)。因此,作业存储库实际上是传递信息的唯一方式(通过持久化的执行上下文)。