Spring 批量将处理后的记录写入文件

Spring Batch Write processed records to file

这是我之前 的延续。由于原始问题已关闭

根据接受的答案,可以使用 tasklet,我还尝试在使用 jackson / JsonFileItemWriter[= 的面向块的步骤中实现自定义项目编写器27=],我们可以使用它吗?它对性能有什么影响吗?

public void write(final List<? extends Person> persons) throws Exception {
            
       for (Person  person: persons) {
            objectMapper.writeValue(new File("D:/cp/dataTwo.json"), person);
       }
            
}

问题一:“是否推荐上述方法?”

问题 2:“我们可以在项目处理器本身中生成文件并使用无操作项目编写器吗?”

有人可以帮忙吗?

如果您查看 spring 批处理框架,它包含三个步骤,如 mentioned here -

这意味着它将输入和输出分离为一个单独的操作。因此,如果您计划将写入和处理混合在一起,基本上是违反目的的,并且会引入紧耦合,这可能会影响您的性能 运行。 (将其视为 map-reduce 操作。它们需要相互排斥、明确定义的输入和输出。)

现在,关于推荐的问题,是的。如果您正在使用 spring 批处理,这是处理记录的最佳方式,以块的形式读取它们,然后以块的形式写入它们。通常使用批处理来处理孤立的任务,这样到时候,这些东西就可以并行执行了。所以,只要你不是同时修改同一个文件,你应该很好地采用这种方法..

Question 1 : Is the above approach recommended?

  • 您的案例是连续的,您必须为每条记录写入一个文件。因此,通过接收大量记录的编写器,您不会获得任何额外优势。

  • 如果您的编写器发生任何错误,spring 批处理将不得不重试整个块并重写到目前为止在该块中成功的文件,因为 spring 批处理不会'检查中的哪条记录写入失败。因此,与另一个问题上基于 tasklet 的答案相比,我认为它有缺点。

Can we generate file in item processor itself and use no-op item writer?

  • 我在这里没有看到大的性能问题或错误处理问题,因为它是逐条记录的,即使为每个块调用一个空的 no-op 编写器也是如此。但是 Spring 必须在将块传递给 writer 之前缓存该块,以便万一 writer 抛出可跳过的异常,它可以重试。因此,即使您使用 no-op 编写器,它也会对其进行缓存,但我不知道它会以多快的速度清除它,因为您是 no-op 编写器。

  • 从最佳实践的角度来看,我对这种方法感到非常不安,就好像一个新的开发人员加入,他不会去查看你的处理器以了解它正在充当编写器。

总结

我将在另一个问题上使用基于 Tasklet 的方法