我是Spring的新手,我对Spring没有多少了解,请帮我解决这个问题。我的用例是:我们使用Spring批处理,以chunk为导向的处理来处理数据。
在每个已处理的块的末尾(即,一旦满足提交间隔并且值传递给writer),就必须存储值列表,以便在完成整个tasklet后,存储的值列表必须是用于将值写入csv文件。如果块处理中发生任何作业失败,则不应将值列表写入文件。
有没有办法将大量数据存储在块级别,然后最终处理下一步/ tasklet或其他任何方式?
答案 0 :(得分:1)
不要将所有数据存储在内存中;对于批量申请来说,这是一个糟糕的实践
另一种方法是创建标准的读/处理/写入步骤,在其中将csv文件写入已处理的块。
发生作业错误时,停止作业并删除您的csv文件(您将得到相同的结果,而不是完全写入它)。
我认为你达到了你的目标,而不是内存问题。
答案 1 :(得分:1)
我建议采用不同的方法,因为从我的角度来看,你正试图以一种不计划工作的方式使用弹簧批。
您可以使用SystemCommandTasklet或为6和7实现自己的tasket
您的听众看起来与下面的听众类似
@Component
public class PromoteUpdateCountToJobContextListener implements StepListener {
@OnProcessError
public ExitStatus processError(Object item, Exception e){
String failureMessage = String.format("Failed to process due to item %s" ,
item.toString());
Logger.error(failureMessage);
return ExitStatus.FAILED;
}
}
您的工作xml将类似于:
<batch:job>
<batch:step id="processData">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="someReader"
writer="yourFlatFileItemWriter"/>
</batch:tasklet>
<batch:next on="*" to="renameTempCsv" />
<batch:next on="FAILED" to="deleteTempCsv" />
<batch:listeners>
<batch:listener ref="lineCurserListener" />
</batch:listeners>
</batch:step>
<batch:step id="deleteTempCsv">
<batch:tasklet ref="deleteTempCsvTasklet"/>
</batch:step>
<batch:step id="renameTempCsv">
<batch:tasklet ref="renameTempCsvTasklet"/>
</batch:step>
</batch:job>