对于一个项目,我需要处理一个表中的项目,并为3个不同的表生成3个不同的项目,所有3个在第二个数据源中,与第一个项目不同 . 通过Oracle DB上的Spring Batch完成实现 . 我认为question有类似于我需要的东西,但在那里它只写了一个不同的项目 .
为了说明这种情况:
DataSource 1 DataSource 2
------------ ------------------------------
Table A Table B Table C Table D
读者应该从表A中读取一个项目 . 在处理器中,使用A中项目的信息,将创建B,C和D类型的3个新项目 . 此外,将更新表A中的项目 .
作者应该能够同时写出所有4个项目 . 我的第一个实现是使用JpaItemWriter来更新项目A,但我不知道处理器如何将其他3个项目提供给编写器以便同时保存所有项目 .
处理器可以从不同类型返回多个项目吗?我是否需要创建4个步骤,每个步骤都写一个项目?在这种情况下,这将是错误安全的(如果写入D时出错,那么A,B和C将会回滚)?
在此先感谢您的支持!
1 回答
你的问题实际上是两个问题 . 让我们分别看一下:
Can an ItemProcessor return multiple items
对于传入的每个项目,ItemProcessor一次只能返回一个项目 . 因此,在您的特定场景中,您需要
ItemProcessor
返回包装项目A,B,C和D的包装器对象 .How can I write different types in the same step
Spring Batch在很大程度上依赖于编程模型中的组合 . 由于
ItemProcessor
将返回一个包装器对象,因此您最终会编写一个ItemWriter
,它会解开项目A,B,C和D,并将每个项目的写入委托给适当的编写者 . 所以在最终的解决方案中,你最终会得到5个ItemWriter
:每个项目类型一个,包含所有这些项目的一个 . 以这里的例子来看看我们的CompositeItemWriter
:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemWriter.java