Spring 批处理 - 无事务的面向块的处理
Spring Batch - Chunk Oriented Processing without transactions
我一直在研究各种批处理框架,我很欣赏 Spring Batch 带来的抽象和开箱即用的功能,例如跳过、重试、侦听器等,我很喜欢熟悉 Spring 框架,所以这是一个自然的选择。
但是,我打算创建的批处理流程在 reader-process-write 流程的两端都没有事务数据库。我希望使用 Spring Batch 通过 API 连接两个系统,并且仍然利用批处理框架来跟踪作业执行并使用 Spring Batch 数据库支持批处理应用程序。
远程API支持他们自己的批处理概念,因此,我们可以确保处理 100 条记录并尝试在一条记录无效时整个批处理失败的情况下进行批量插入。这样,我仍然希望 Spring 批处理“回滚”并单独重试每条记录。
是否可以利用 Spring Batch 及其支持的批处理元数据数据库来使用跳过和重试,而无需保持数据库连接或在基于块的处理期间使用事务?
编辑:
根据 Mahmoud 的评论,我可以使用带有 JobRepository
的 DataSourceTransactionManager
和带有块步骤的 ResourcelessTransactionManager
。所以我会定义一个自定义 StepBuilderFactory
:
@Component
public class MyStepBuilderFactory extends StepBuilderFactory {
public MyStepBuilderFactory(JobRepository jobRepository) {
super(jobRepository, new ResourcelessTransactionManager());
}
}
面向块的 tasklet 需要事务管理器来处理您正在寻找的“回滚”语义。如果您的步骤不与事务资源交互,您可以将其配置为使用 ResourcelessTransactionManager
。这个事务管理器是一个 NoOp 实现,可以在这种情况下使用。
您始终可以将 DataSourceTransactionManager
与作业存储库一起使用来跟踪 job/step 执行元数据。
我一直在研究各种批处理框架,我很欣赏 Spring Batch 带来的抽象和开箱即用的功能,例如跳过、重试、侦听器等,我很喜欢熟悉 Spring 框架,所以这是一个自然的选择。
但是,我打算创建的批处理流程在 reader-process-write 流程的两端都没有事务数据库。我希望使用 Spring Batch 通过 API 连接两个系统,并且仍然利用批处理框架来跟踪作业执行并使用 Spring Batch 数据库支持批处理应用程序。
远程API支持他们自己的批处理概念,因此,我们可以确保处理 100 条记录并尝试在一条记录无效时整个批处理失败的情况下进行批量插入。这样,我仍然希望 Spring 批处理“回滚”并单独重试每条记录。
是否可以利用 Spring Batch 及其支持的批处理元数据数据库来使用跳过和重试,而无需保持数据库连接或在基于块的处理期间使用事务?
编辑:
根据 Mahmoud 的评论,我可以使用带有 JobRepository
的 DataSourceTransactionManager
和带有块步骤的 ResourcelessTransactionManager
。所以我会定义一个自定义 StepBuilderFactory
:
@Component
public class MyStepBuilderFactory extends StepBuilderFactory {
public MyStepBuilderFactory(JobRepository jobRepository) {
super(jobRepository, new ResourcelessTransactionManager());
}
}
面向块的 tasklet 需要事务管理器来处理您正在寻找的“回滚”语义。如果您的步骤不与事务资源交互,您可以将其配置为使用 ResourcelessTransactionManager
。这个事务管理器是一个 NoOp 实现,可以在这种情况下使用。
您始终可以将 DataSourceTransactionManager
与作业存储库一起使用来跟踪 job/step 执行元数据。