将大量数据存储在Spring批处理的Chunk Level中

时间:2014-06-28 19:43:49

标签: spring-batch

我是Spring的新手,我对Spring没有多少了解,请帮我解决这个问题。我的用例是:我们使用Spring批处理,以chunk为导向的处理来处理数据。

在每个已处理的块的末尾(即,一旦满足提交间隔并且值传递给writer),就必须存储值列表,以便在完成整个tasklet后,存储的值列表必须是用于将值写入csv文件。如果块处理中发生任何作业失败,则不应将值列表写入文件。

有没有办法将大量数据存储在块级别,然后最终处理下一步/ tasklet或其他任何方式?

2 个答案:

答案 0 :(得分:1)

不要将所有数据存储在内存中;对于批量申请来说,这是一个糟糕的实践 另一种方法是创建标准的读/处理/写入步骤,在其中将csv文件写入已处理的块。
发生作业错误时,停止作业并删除您的csv文件(您将得到相同的结果,而不是完全写入它)。
我认为你达到了你的目标,而不是内存问题。

答案 1 :(得分:1)

我建议采用不同的方法,因为从我的角度来看,你正试图以一种不计划工作的方式使用弹簧批。

  1. 按块处理数据块,并使用FlatFileItemWriter将每个块写入csv。
  2. 使用标记为临时文件的文件名。
  3. 使用侦听器包裹您的步骤并使用OnProcessError挂钩。
  4. 点击OnProcessError时记录失败的项目
  5. 为成功和失败添加条件流,请参阅here
  6. 如果是删除临时文件
  7. 如果成功重命名文件
  8. 您可以使用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>