spring 批次中的多个 reader/processor/writer

Multiple reader/processor/writer in spring batch

我是 Spring 批处理的新手,我遇到了一个特殊问题。我想使用 JpaPagingItemReader 从 3 个不同的 jpa 查询中获取结果并单独处理它们并使用 StaxEventItemWriter 将它们写入一个合并的 XML 文件中。

例如结果 XML 看起来像

<root>
 <query1>
 ...
 </query1>
 <query2>
 ...
 </query2>
 <query3>
 ...
 </query3>
</root>

请让我知道如何实现这一点?

此外,我目前通过一个查询实现了我的配置器,但 reader/writer 也很慢。生成 20MB 的文件大约需要 59 分钟,因为我现在 运行 它在单线程环境中,而不是多线程环境。如果还有其他建议,请告诉我。谢谢。

编辑: 我尝试遵循这种方法: 创建了 3 个不同的步骤并在每个步骤中添加了 1 reader、处理器、编写器,但我现在面临的问题是编写器无法写入同一文件或附加到它。 这是在 StaxEventItemWriter class 中写的: FileUtils.setUpOutputFile(file, restarted, false, overwriteOutput); 这里第三个参数 append 默认为 false。

我想到的一个选择是

  1. 创建 StaxEventItemWriter
  2. 创建具有 JpaPagingItemReader 的步骤的 3 个实例并将相应的 <queryX>...</queryX> 部分写入共享编写器
  3. JobExecutionListener中写<root></root>标签,所以步骤不关心信封

这里还有其他的考虑因素,比如它是否总是 3 个文件等。但总体思路是将处理器、步骤、作业、任务和侦听器之间的关注点分开,使每个执行一个明确的工作。

使用 JVisualVm 监控应用程序内部的瓶颈。 由于您说创建 20MB 的文件需要 59 分钟,因此您将更好地了解性能受到影响的地方。

VisualVm tutorial

打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 样本。 在不同的时间拍摄快照并分析它在哪里花费了很多时间。通过仅选中此选项,您将获得足够的数据进行优化。

注意:JvisualVm 属于 oracle jdk8 发行版。您可以简单地在命令 prompt/terminal 上键入 jvisualvm。如果不是从 here

下载

你的问题的第二种方法似乎是正确的方向,你可以创建 3 个不同的 readers/processors/writers 并创建你的自定义编写器,它应该扩展允许 setAppend 的 AbstractFileItemWriter。此外,我已经看到 xmlWriter 编写的 xml 比 StaxEventItemWriter 更快,但是在编写样板代码时有一些折衷。