情况:
我从 db 读取互联网上文件的 url。在 itemProcessor 中,我下载了这个文件,我想将每一行保存到数据库中。然后继续处理,我想创建一些我想保存到数据库的新类“摘要”。应该如何在春季批处理中配置我的工作?
情况:
我从 db 读取互联网上文件的 url。在 itemProcessor 中,我下载了这个文件,我想将每一行保存到数据库中。然后继续处理,我想创建一些我想保存到数据库的新类“摘要”。应该如何在春季批处理中配置我的工作?
您可以使用CompositeItemWriter。
但也许您的摘要处理应该在另一个步骤中读取您之前插入的行
对于您的用例作业,可以使用此步骤序列定义(通过这种方式,该作业也可以重新启动):
Tasklet
:Tasklet 是处理单个步骤的策略;在您的情况下,类似于这篇文章的内容可以帮助并将本地文件名存储到JobExecutionContext
.FlatFileItemReader<S>
(或您自己的 ItemReader/ItemStream 实现)读取下载的文件ItemProcessor<S,T>
每行使用一个进程MyWriter<T>
进行汇总计算并委托给ItemWriter<T>
T 的数据库持久性和ItemWriter<Summary>
写入Summary
对象。<S>
是 bean 包含每个文件行并且
<T>
是您写入 db 的 bean
MyWriter<T>
可以这样使用:
class MyWriter extends ItemWriter<T> {
private ItemWriter<Summary> summaryWriter;
private ItemWriter<T> tWriter;
public void write(List<? super T> items) {
List<Summary> summaries = new ArrayList<>(items.size());
for(T item : items) {
final Summary summary = /* Here create summary object reading from
* database or creating new object */
/* Do summary or update summary */
summaries.add(summary);
}
/* The code above is trivial: you can group Summary object using a Map<SummaryKey,Summary> to reduce reading and use summaryWriter.write(summariesMap.values()) for example */
tWriter.write(items);
summaryWriter.write(summaries);
}
}
您需要同时保存为流MyWriter.summaryWriter
和MyWriter.tWriter
可重新启动性。