0

情况:

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

4

2 回答 2

0

您可以使用CompositeItemWriter

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

于 2013-08-23T08:51:17.143 回答
0

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

  1. 使用以下方法将文件从 URL 下载到 HDD Tasklet:Tasklet 是处理单个步骤的策略;在您的情况下,类似于这篇文章的内容可以帮助并将本地文件名存储到JobExecutionContext.
  2. 处理下载的文件:
    2.1。使用FlatFileItemReader<S>(或您自己的 ItemReader/ItemStream 实现)读取下载的文件
    2.2ItemProcessor<S,T>每行使用一个进程
    2.3 将每个要在 2.2 中处理的对象写入数据库,使用自定义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.summaryWriterMyWriter.tWriter可重新启动性。

于 2013-08-23T20:41:24.933 回答