java - Spring 批处理元素分割器

标签 java spring spring-batch jobs spring-integration

我遇到以下问题:我有一个文件,其中每行都会将 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/

相关文章:

java - 使用 Spring Boot 和 Spring Batch 读取 .csv 文件并将其存储在数据库中

java - 如何访问 Wicket 中的中央 ResourceBundle

java - 包含 jspf 时出错

java - Grails 2.0.4 打开 zip 文件时出错或缺少 Springloaded 的 JAR list

java - 使用当前年份的 JPA/Hibernate 主键值序列

java - 在 Spring 批处理中重试阅读器

java - Spring Batch Java 配置 : Skip step when exception and go to next steps

java - Apache ftpserver 上传通知

java - 搜索字符串数组

spring - 找不到元素 'jpa:repositories' 的声明