【问题标题】:Spring batch reader, processor and writer flowSpring 批量读取器、处理器和写入器流程
【发布时间】:2014-10-30 06:56:54
【问题描述】:

我有一个批处理步骤

  <batch:step id="read-process-input-file">
  <batch:tasklet>
    <batch:chunk commit-interval=1000
                 reader="item-reader"
                 processor="item-processor"
                 writer="item-writer"
                 skip-limit=1000>

      <batch:skippable-exception-classes>
        <batch:include class="java.lang.Exception"/>
      </batch:skippable-exception-classes>

    </batch:chunk>
  </batch:tasklet>
  <batch:listeners>
    <batch:listener ref="entityOperationExceptionHandler"/>
    <batch:listener ref="filenameListener"/>
    <batch:listener ref="promotionListener"/>
  </batch:listeners>
</batch:step>
  • 阅读器和处理器流程如何工作?阅读器是读取一个块并等待处理器处理它还是一次读取所有块。

【问题讨论】:

    标签: java batch-processing spring-batch


    【解决方案1】:

    读取器被调用以读取一个项目,然后将其传递给处理器。处理器的结果被缓存。重复此操作,直到达到提交间隔。然后将缓存的处理器结果传递给写入器,并提交事务。

    如果还有更多工作要做,整个序列会重新开始。

    所有这一切都发生在一个线程中,因此读取-处理-读取-处理......是顺序完成的。

    更新:我刚刚了解到这并不完全正确。我描述的序列对于 Spring Batch 的 JSR 352 实现(这是我正在使用的)当然是有效的,并且由于文档对“经典”实现的声明相同,我认为它一定是正确的。

    但是,这个问题的答案显示有区别:Spring Batch documentation about chunk-oriented step versus reality?

    因此,对于非 JSR 352 实现,顺序是读取 - 读取 - 读取 ... 处理 - 处理 - 处理 ... 写入

    【讨论】:

    • 我在此使用的编写器是 FlatFileItemReader,块大小为 1000。因此,阅读器将读取 1000 行并将其传递给处理器还是读取 1 行然后将其传递给处理器下一个等等
    • 它将读取一行,然后将其传递给处理器,然后读取下一行等。
    • 有没有办法让阅读器读取块然后将其发送到处理器。
    • 在基于chunk的处理spring批处理中控制读-处理-写周期。如果您需要更多控制,可以执行 Tasklet 步骤,如下所述:docs.spring.io/spring-batch/trunk/reference/html/…
    • @Thomas 是否有任何其他替代解决方案可以在没有 JSR 的情况下按顺序完成读取-处理-读取-处理...
    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 2018-02-06
    • 2020-09-10
    • 1970-01-01
    • 2018-03-23
    • 2018-04-15
    • 2014-07-22
    • 2021-10-20
    相关资源
    最近更新 更多