春季批次中的多个读取器/处理器/写入器



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

例如,生成的 XML 如下所示,

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

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

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

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

解决问题的第二种方法似乎是正确的方向,您可以创建 3 个不同的阅读器/处理器/编写器并创建自定义编写器,该编写器应该扩展允许 setAppend 的 AbstractFileItemWriter。另外,我已经看到xmlWriter比StaxEventItemWriter编写更快的xmls,但是在编写样板代码时有一些权衡。

我头顶上的一个选择是

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

这里还有其他注意事项,例如是否总是 3 个文件等,但一般的想法是将处理器、步骤、作业、任务和侦听器之间的关注点分开,以使每个问题都执行清晰的工作。

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

可视化导航教程

打开 visualvm 连接您的应用程序 => 采样器 => CPU => CPU 样本。 在不同时间拍摄快照,并分析需要花费大量时间的地方。仅通过选中此设置,您将获得足够的数据进行优化。

注意:JvisualVm 属于 oracle jdk 8 发行版。 您只需在命令提示符/终端上键入 jVisualVM。 如果没有从这里下载

最新更新