使用Spring批处理写入不同的Data Sources

Use Spring Batch to write in different Data Sources

对于一个项目,我需要处理来自一个 table 的项目,并为 3 个不同的 table 生成 3 个不同的项目,第二个数据源中的所有 3 个都不同于第一个项目.实施是通过 Spring Batch over Oracle DB 完成的。我认为这个 question 有一些与我需要的类似的东西,但它在最后只写了一个不同的项目。

说明情况:

DataSource 1                               DataSource 2
------------                        ------------------------------

   Table A                          Table B     Table C    Table D

reader 应该从 table A 中读取一个项目。在处理器中,使用 A 中项目的信息,将创建 3 个类型为 B、C 和 D 的新项目。此外,table A 中的项目将被更新。

作者应该能同时写出所有4个项目。我的第一个实现是使用 JpaItemWriter 来更新项目 A,但我不知道处理器如何将其他 3 个项目提供给编写器以便同时保存所有项目。

一个处理器可以 return 多个来自不同类型的项目吗?我是否需要创建 4 个步骤,每个步骤写一个项目?在这种情况下,这是否是错误安全的(如果写入 D 时出错,那么 A、B 和 C 将回滚)?

在此先感谢您的支持!

你的问题其实是两个问题。让我们分别看一下:

可以 ItemProcessor return 多个项目
对于传入的每个项目,ItemProcessor 一次只能 return 一个项目。因此,在您的特定场景中,您需要 ItemProcessor 到 return 包装对象包装项目 A、B、C 和 D。

如何在同一个步骤中写不同的类型
Spring Batch 在其编程模型中严重依赖组合。由于您的 ItemProcessor 将 return 包装对象,因此您最终将编写一个 ItemWriter 来解包项目 A、B、C 和 D,并将每个项目的写入委托给合适的作家。因此,在最终解决方案中,您将得到 5 ItemWriters:一个用于每种项目类型,一个用于包装所有这些。以我们的 CompositeItemWriter 为例:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemWriter.java