Java Spring批处理将处理过的记录写入文件

Java Spring批处理将处理过的记录写入文件,java,spring,spring-batch,Java,Spring,Spring Batch,这是我上一篇文章的延续。因为原来的问题已经结束了 根据公认的答案,tasklet可以使用,我还尝试在一个面向块的步骤中使用jackson/JsonFileItemWriter实现自定义项编写器,我们可以使用它吗?它对性能有何影响 public void write(final List<? extends Person> persons) throws Exception { for (Person person: persons) {

这是我上一篇文章的延续。因为原来的问题已经结束了

根据公认的答案,tasklet可以使用,我还尝试在一个面向块的步骤中使用jackson/JsonFileItemWriter实现自定义项编写器,我们可以使用它吗?它对性能有何影响

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

publicvoidwrite(final List如果您查看spring批处理框架,它包含三个步骤,如下所示-

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

现在,关于推荐的问题,是的。如果您使用的是spring batch,这是处理记录的最好方法,以区块的形式读取记录,然后以区块的形式写入记录。通常batch用于处理独立的任务,因此,时间到了,这些内容可以并行执行。因此,只要您不同时修改同一个文件,你应该很乐意采用这种方法

问题1:是否建议采用上述方法

  • 您的案例是连续的,您必须为每条记录编写一个文件。因此,让一个writer接收记录块并不会带来任何额外的优势

  • 如果写入程序中发生任何错误,spring batch将不得不重试整个区块,并重写该区块中迄今为止成功的文件,因为spring batch无法重写检查中的记录。因此,与基于tasklet的另一个问题的答案相比,我认为这是一个缺点

我们是否可以在项目处理器本身中生成文件,并且不使用op项目编写器

  • 我在这里看不到大的性能问题或错误处理问题,因为它是一条记录一条记录的,即使为每个区块调用了空的无操作写入程序。但Spring必须在将区块传递给写入程序之前缓存该区块,以便在写入程序抛出可跳过的异常时,它可以重试。因此,即使您不使用操作写入程序,它也会缓存该区块,但我不这么做知道它会多快清除它,因为你是一个无操作的作家

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

摘要


基于另一个问题,我将采用基于Tasklet的方法

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