我遇到以下问题:我有一个文件,其中每行都会将 1 个或多个项目写入数据库。我需要从另一个系统进行查找,以找出需要写入的项目数。单行生成的每个项目都必须使用项目处理器链进行转换,并最终写入数据库中的多个表。
由于每个项目需要写入多个表,因此它们必须各自位于自己的事务中。因此,我不能只拥有 ItemProcessor<Foo, List<Bar>>
它处理它。在这种情况下——即使有 commit-interval
1 - 我最终会在同一笔交易中获得多个项目。
我见过this堆栈溢出问题已经有了。由于交易问题,接受的答案对我没有帮助。关于使用 Spring Integration splitter 的另一个答案听起来很有趣。但是,它没有提供大量细节。如何将阅读器的输出定义为 channel 输入?我如何定义进入我的项目编写器的输出 channel ?我如何仍然在每个新划分的项目上运行项目处理器链?
我还没有找到任何在 Spring 批处理作业中使用拆分器的示例。如有任何建议,我们将不胜感激。
最佳答案
FlatFileItemReader 也有同样的问题,但减去了事务问题。 就这样处理了:
public class FlatFileItemListWriter<T> extends FlatFileItemWriter<T> {
/**
* {@inheritDoc}
*
* @see org.springframework.batch.item.file.FlatFileItemWriter#write(java.util.List)
*/
@Override
@SuppressWarnings("unchecked")
public void write(List<? extends T> itemsLists) throws Exception {
List<T> items = new ArrayList<T>();
for (Object item : itemsLists) {
items.addAll((List<T>) item);
}
super.write(items);
}
}
这样,FlatFileItemWriter 就会按照我的处理器不生成列表时的方式处理列表。
关于java - Spring 批处理元素分割器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348675/