我为什么要使用Spring批处理Jobrepository?
我知道JobRepository用于作业状态的CRUD操作。我使用的是一个持久数据库,JobRepository是将历史元数据保存在数据库中,还是只存储当前正在运行的进程我为什么要使用Spring批处理Jobrepository?,spring,spring-batch,Spring,Spring Batch,我知道JobRepository用于作业状态的CRUD操作。我使用的是一个持久数据库,JobRepository是将历史元数据保存在数据库中,还是只存储当前正在运行的进程 另外,如果我有一系列作业由作业调度器执行,并且每个作业都有自己的JobRepository数据库,那么它们是共享相同的持久表还是我必须为每个JobRepository创建不同的数据库?Spring Batch JobRepository存储每个批处理作业的详细信息,而不仅仅是当前作业。 无论如何或谁执行作业,只要作业在spri
另外,如果我有一系列作业由作业调度器执行,并且每个作业都有自己的JobRepository数据库,那么它们是共享相同的持久表还是我必须为每个JobRepository创建不同的数据库?Spring Batch JobRepository存储每个批处理作业的详细信息,而不仅仅是当前作业。 无论如何或谁执行作业,只要作业在spring上下文中共享相同的jobRepository配置,它都会将作业详细信息持久化到为jobRepository配置的相同数据库中
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSourceName" />
</bean>
Spring批处理作业存储库不仅存储当前作业,还存储每个批处理作业的详细信息。 无论如何或谁执行作业,只要作业在spring上下文中共享相同的jobRepository配置,它都会将作业详细信息持久化到为jobRepository配置的相同数据库中
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSourceName" />
</bean>
运行spring batch需要作业存储库,但这是需要一些工作才能真正实现任何价值的事情之一(例如,设置spring batch admin或编写自己的ui)。在实践中,在我所看到的大多数项目中,使用SpringBatch作业存储库纯粹是一个只写的东西,往往会被完全忽略。你必须拥有它,没有人会看它。使用sql客户机在表中查找包含错误、警告和堆栈跟踪的日志,如果您正确地设置日志记录,并且正确地执行日志记录对于任何严肃的服务器端业务来说都是一项困难的要求,那么就不是一件事了 依我看,让作业存储库成为可选的将是一件好事,因为它增加了很多复杂性。大多数项目根本不需要它。大多数确实需要它的项目(例如多节点批处理集群)可能也应该考虑其他技术,这些技术实际上旨在提供跨集群状态管理(例如Zookeeper)。此外,在这一点上,您可能最好看看SpringCloud、hadoop或类似的解决方案。SpringBatch是实现这些解决方案的垫脚石 有些事情需要注意:
- SpringBatch将使用您可能希望位于生产数据库之外的其他位置的信息创建和填充表
- 如果最终在生产数据库中使用了spring批处理表(例如,因为为根本不关心的表提供额外的数据库可能会有点过头),那么您可能需要确保这些表是数据库迁移脚本的一部分 <> LI>也可以考虑定期清理这些表中积累的数据,特别是如果你从来没有真正用它做任何事情。
- 默认情况下,作业只能运行一次,实际上您必须将它们配置为能够运行多次。它实际上将已运行的作业存储在作业存储库中,并且默认情况下,如果您再次运行某个作业,则不会执行任何操作。这个“特性”在很多场合都让我大吃一惊。解决方案是在作业中添加一个
李>.incrementer(new RunIdIncrementer())
- SpringBatch假设您的作业和步骤将分布在集群中(即使对于大多数项目来说,这永远不会成为一件事)。因此,作业存储库实际上是传递信息的唯一途径(通过持久化的执行上下文)
- SpringBatch将使用您可能希望位于生产数据库之外的其他位置的信息创建和填充表
- 如果最终在生产数据库中使用了spring批处理表(例如,因为为根本不关心的表提供额外的数据库可能会有点过头),那么您可能需要确保这些表是数据库迁移脚本的一部分 <> LI>也可以考虑定期清理这些表中积累的数据,特别是如果你从来没有真正用它做任何事情。
- 默认情况下,作业只能运行一次,实际上您必须将它们配置为能够运行多次。它实际上将已运行的作业存储在作业存储库中,并且默认情况下,如果您再次运行某个作业,则不会执行任何操作。这个“特性”在很多场合都让我大吃一惊。解决方案是在作业中添加一个
李>.incrementer(new RunIdIncrementer())
- SpringBatch假设您的作业和步骤将分布在集群中(即使对于大多数项目来说,这永远不会成为一件事)。因此