我正在使用弹簧批处理来读取平面文件。该文件有相关记录。即,可以有一个父记录和任意数量的子记录,我想读取所有记录并调用 Web 服务来存储它。我还想捕获关系并将其存储。一个挑战是子记录可以在文件中的任何位置。而且孩子也可以有很多孩子的记录。我无法用spring batch找到这个问题的解决方案。请提供您的建议
更新:我没有任何选择使用数据库作为数据的临时存储。
我正在使用弹簧批处理来读取平面文件。该文件有相关记录。即,可以有一个父记录和任意数量的子记录,我想读取所有记录并调用 Web 服务来存储它。我还想捕获关系并将其存储。一个挑战是子记录可以在文件中的任何位置。而且孩子也可以有很多孩子的记录。我无法用spring batch找到这个问题的解决方案。请提供您的建议
更新:我没有任何选择使用数据库作为数据的临时存储。
我通过多次处理文件解决了这个问题。
在每次通过时,我都会尝试使用这样的 alg 读取\处理文件中的每条记录:
然后声明循环和决策者:
<batch:step id="processParentAndChilds" next="loop">
<batch:tasklet>
<batch:chunk reader="processParentAndChildsReader"
commit-interval="1000">
<batch:processor>
<bean class="processParentAndChildsProcessor"/>
</batch:processor>
<batch:writer>
<bean class="processParentAndChildsWriter"/>
</batch:writer>
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:decision decider="processParentAndChildsRetryDecider" id="loop">
<batch:next on="NEXT_LEVEL" to="processprocessParentAndChilds"/>
<batch:next on="COMPLETED" to="goToNextSteps"/>
</batch:decision>
public class ProcessParentAndChildsRetryDecider implements JobExecutionDecider{
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
// if no on record written - no sense to try again
if (stepExecution.getWriteCount() > 0) {
return new FlowExecutionStatus("NEXT_LEVEL");
} else {
return FlowExecutionStatus.COMPLETED;
}
}
}