情况:
我从db上读取了互联网上的文件URL。在itemProcessor中我下载了这个文件,我想将每一行保存到数据库中。然后处理继续,我想创建一些新的类“摘要”,我也想保存到db。如何在春季批量配置我的工作?
答案 0 :(得分:0)
您可以使用CompositeItemWriter。
但也许您的摘要处理应该在另一个步骤中读取您之前插入的行
答案 1 :(得分:0)
对于您的用例作业,可以使用此步骤顺序定义(以这种方式,此作业也可以重新启动):
Tasklet
将文件从URL下载到HDD:一个Tasklet是处理单个步骤的策略;在您的情况下,类似于this帖子的内容可以帮助并将本地文件名存储到JobExecutionContext
。FlatFileItemReader<S>
(或您自己的ItemReader / ItemStream实现)读取下载的文件ItemProcessor<S,T>
个进程
2.3使用自定义MyWriter<T>
将每个要在2.2中处理的对象写入数据库,自定义ItemWriter<T>
执行汇总计算并委托给ItemWriter<Summary>
以获取T的数据库持久性,并委托Summary
编写<S>
对象。 <T>
是bean包含每个文件行和
MyWriter<T>
是您写入db的bean
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
和{{1}}保存为流,以便重新启动。