Spring Batch-如何在处理器中同时处理多条记录?

标签 spring spring-batch

我有一个文件可以解析和处理记录。它可以逐行正常工作(一次解析一条记录)。我的要求是我必须通过多行解析并从每个记录中获取所需的信息,然后在组合从所有记录中获取的信息后,我调用一个服务来执行业务逻辑。我必须在我的 Processor 类中执行这个逻辑。数据如下例所示:

001 123456 987654321551580 韦恩博士 1

001 123456 987654321552APT 786 1

001 123456 987654321553洛杉矶 1

001 123456 987654321554CA 1

001 123456 98765432155590001 1

第 30-32 列可用的数据元素是我有兴趣从每条记录中获取的数据元素。在上面的示例中,每行中的值分别为 551、552、553、554、555。它们都一起出现在文件中。所以基本上当我的处理器中的当前项目解析第一行并发现它的“551”(在业务代码中表示地址 Line1)时,我想获取该行后面的其余地址并将它们保存在一个完整的地址。最后,我想将此地址从处理器传递给服务类,然后继续解析文件中可用的下一条记录。我的问题是处理器为每条记录逐行工作,因此我无法在所有这些相关行之间保持跟踪/关联。
抱歉,如果我无法以更简单的方式解释我的问题......我是 Spring Batch 的新手并且仍在学习。

最佳答案

如果您知道文件中关联的数据记录将彼此相邻(而不是随机分布),您可以利用 SingleItemPeekableItemReader 关联多行以创建一个完整的对象。这个 older answer 有更多信息。

示例上下文文件:

<bean id="peekingReader" class="com.package.whatever.YourPeekingReader">
    <property name="delegate" ref="flatFileItemReader"/>
</bean>

<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="file://temp/file.txt" />
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer" ref="yourTokenizer"/>
            <property name="fieldSetMapper" ref="yourMapper"/>
        </bean>
    </property>
</bean>

示例窥视阅读器:
public class YourPeekingReader extends SingleItemPeekableItemReader<YourObject> {

    @Override
    public YourObject read() {

        YourObject item = super.read();

        if (item == null) {
            return null;
        }

        while (true) {
            YourObject possibleRelatedObject = peek();
            if (possibleRelatedObject == null) {
                return item;
            }

            //logic to determine if next line in file relates to same object
            boolean matches = false; 

            if (matches) {
                item.addRelatedInfo(super.read());
            } else {
                return item;
            }
        }


    }

}

关于Spring Batch-如何在处理器中同时处理多条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123811/

相关文章:

java - 我如何在 Spring Boot/MVC 中创建错误处理程序(404、500...)

java - Spring Batch Restart 逻辑如何在 hadoop 作业上工作?

java - 在 Spring Batch 中将参数从父作业传递给 StepJob?

spring - MongoRepository 的 saveAll() 是批量插入数据吗?

java - 来自 Spring JMS 和 IBM Websphere MQ 的 JMSCS0002

java - 需要从 spring boot 2.0 中排除 spring-orm 模块并从 jar 文件中使用它的旧版本

java - 为什么 Spring 的 jdbcTemplate.batchUpdate() 这么慢?

Java/Spring - 存储过程调用字符串的差异

spring-boot - 如何在没有 xml 的 Java 配置中使用具有不同数据并具有两个 JdbcBatchItemWritter 的 Spring 批处理 CompositeItemWriter

java - Spring Batch和JobInstanceAlreadyCompleteException: