如何在春季批次中编写多个类

时间:2013-08-23 06:30:10

标签: spring-batch

情况:

我从db上读取了互联网上的文件URL。在itemProcessor中我下载了这个文件,我想将每一行保存到数据库中。然后处理继续,我想创建一些新的类“摘要”,我也想保存到db。如何在春季批量配置我的工作?

2 个答案:

答案 0 :(得分:0)

您可以使用CompositeItemWriter

但也许您的摘要处理应该在另一个步骤中读取您之前插入的行

答案 1 :(得分:0)

对于您的用例作业,可以使用此步骤顺序定义(以这种方式,此作业也可以重新启动):

  1. 使用Tasklet将文件从URL下载到HDD:一个Tasklet是处理单个步骤的策略;在您的情况下,类似于this帖子的内容可以帮助并将本地文件名存储到JobExecutionContext
  2. 处理下载文件:
    2.1。使用FlatFileItemReader<S>(或您自己的ItemReader / ItemStream实现)读取下载的文件
    2.2每行ItemProcessor<S,T>个进程 2.3使用自定义MyWriter<T>将每个要在2.2中处理的对象写入数据库,自定义ItemWriter<T>执行汇总计算并委托给ItemWriter<Summary>以获取T的数据库持久性,并委托Summary编写<S>对象。
  3. <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}}保存为流,以便重新启动。