我有一个文件可以解析和处理记录。它可以逐行正常工作(一次解析一条记录)。我的要求是我必须通过多行解析并从每个记录中获取所需的信息,然后在组合从所有记录中获取的信息后,我调用一个服务来执行业务逻辑。我必须在我的 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/