我为什么要使用Spring Batch Jobrepository?

时间:2017-12-15 01:13:14

标签: spring spring-batch

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

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

2 个答案:

答案 0 :(得分:1)

作业存储库需要运行spring批处理,但这需要一些工作来实际提供任何值(例如设置spring batch admin或编写自己的ui)。在大多数我看过使用Spring Batch的项目中,作业存储库纯粹是一种只能写入的东西,往往被完全忽略。你需要拥有它,没有人会看到它。使用sql客户端在表中挖掘以查找包含错误,警告和堆栈跟踪的日志,如果正确设置日志记录并正确执行日志记录对于任何严肃的服务器端业务都是一项硬性要求。

恕我直言,因为它增加了很多复杂性,所以将作业存储库作为可选项将是一件好事。大多数项目根本不需要它。并且大多数需要它的项目(例如,多节点批处理集群)可能应该查看实际上旨在提供跨集群状态管理的其他技术(例如,Zookeeper)。此外,在这一点上,你可能更喜欢看Spring Cloud,hadoop或类似的解决方案。春季批次是这类解决方案的垫脚石。

要注意的一些事情:

  • Spring批处理将创建和填充表格,其中包含您可能需要的信息,而不是生产数据库。
  • 如果您最终在生产数据库中使用了弹簧批处理表(例如,因为为表格配置一个额外的数据库,您根本不关心这将是过度杀伤),您可能希望确保这些表是db迁移脚本的一部分。
  • 您可能还需要考虑定期清理这些表中累积的数据,特别是如果您实际上从未对其进行过任何操作。
  • 默认情况下,作业只能运行一次,实际上您必须将它们配置为能够多次运行。它实际上存储在已经运行的作业存储库中,并且如果您再次运行某些内容,默认情况下将不会执行任何操作。这个"功能"多次让我感到惊讶。解决方案是为您的工作添加.incrementer(new RunIdIncrementer())
  • Spring批处理假定您的作业和步骤将在集群中分发(即使对于大多数项目来说永远不会是这样)。因此,作业存储库实际上是传递信息的唯一方法(通过执行上下文,它会被持久化)。

答案 1 :(得分:0)

Spring Batch JobRepository存储每个批处理作业的详细信息,而不仅仅是当前作业。 只要作业在spring上下文中共享相同的jobRepository配置,它就会将作业详细信息保存到为jobRepository配置的同一数据库,这与执行作业的方式无关紧要。

<bean id="jobRepository"
        class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
        <property name="dataSource" ref="dataSourceName" />
</bean>