1

我有以下问题:我有一个文件,其中每行导致 1 个或多个项目被写入数据库。我需要从另一个系统进行查找以找出需要写入多少项。从单行产生的每个项目都必须使用项目处理器链进行转换,最后写入数据库中的多个表。

因为每个项目都需要写入多个表,所以它们必须每个都在自己的事务中。因此,我不能只使用ItemProcessor<Foo, List<Bar>>which 来处理它。在那种情况下——即使commit-interval是 1——我最终会在同一个事务中处理多个项目。

我已经看过这个堆栈溢出问题了。由于交易问题,接受的答案对我没有帮助。关于使用 Spring Integration 拆分器的另一个答案听起来很有趣。但是,它并没有提供大量细节。如何将阅读器的输出定义为通道输入?我将如何定义到我的项目编写器的输出通道?我怎么还能在每个新划分的项目上运行项目处理器链?

我无法在春季批处理作业中找到使用拆分器的任何示例。任何建议将不胜感激。

4

1 回答 1

0

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 处理列表的方式与我的处理器不生成列表的方式相同。

于 2015-03-24T13:50:43.380 回答