代码之家  ›  专栏  ›  技术社区  ›  user313

itemProcessor中的自定义计数器

  •  1
  • user313  · 技术社区  · 11 年前

    如何在itemProcessor中实现自定义计数器?基本计数器可以按定义工作 here ,但我需要计数器不包括重试项目或回滚chunck中的项目。也许我还没有找到itemProcessor的类似itemStream的接口。使用SpringBatch 2.1.7。

    EDIT: 可以找到批处理配置 here (使用compositeProcessor)。我尝试过如下实现计数器(没有运气): 为所有处理器设置itemProcessListener,并在afterProcess(I,O)中递增缓存中每个处理器的计数器(缓存也在每个处理器中)。然后对所有处理器使用itemWriteListener,并在afterWrite()中将缓存刷新到stepExecution。但这不起作用,因为itemProcessListener没有像我预期的那样与compositeProcessors子处理器一起工作。还有其他想法吗?

    编辑: 我删除了compositeProcessor并尝试仅使用一个处理器,发现itemProcessListener.afterProcess将被调用太多次。我猜测这与块处理模式与单个处理模式有关。因此,块中一些未重试的项目将被重新处理。我也尝试过使用RetryListener(如果正在重试,则禁用计数器增量),但无法配置它。不会在RetryListen上调用open和close。

    2 回复  |  直到 9 年前
        1
  •  0
  •   Luca Basso Ricci    11 年前

    我想 StepExecution 域对象应该符合您的要求。
    用一个 StepExecutionListener 以及访问所需的财产。

        2
  •  0
  •   user313    11 年前

    我能够解决这个反问题;然而,我对批次做了一些更改。首先要删除的是compositeItemProcessor。然后我需要将SpringBatch版本更新到2.2.7(以获取ChunkListener.afterChunkError)。现在,当处理器增加计数器时,我会将计数器缓存到处理器。我还使用ChunkListener.afterChunkError清除缓存,因此当重新处理项目时,将清除旧的计数器值。当ItemWriteListener.afterWrite()发生时,我会将缓存刷新到stepExecutionContext。通过这种方式,我能够克服重试增量计数器的问题。