我是春季批次的新手,我有一个特殊的问题。我想使用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,但是在编写样板代码时有一些权衡。
我头顶上的一个选择是
- 创建
StaxEventItemWriter
- 创建具有
JpaPagingItemReader
的步骤的 3 个实例,并将相应的<queryX>...</queryX>
部分写入共享编写器 - 在
JobExecutionListener
中写入<root>
和</root>
标签,因此步骤不关心信封
这里还有其他注意事项,例如是否总是 3 个文件等,但一般的想法是将处理器、步骤、作业、任务和侦听器之间的关注点分开,以使每个问题都执行清晰的工作。
使用JVisualVm来监控应用程序内部的瓶颈。 由于您说创建 59MB 的文件需要 20 分钟,因此您将更好地了解性能影响的位置。
可视化导航教程
打开 visualvm 连接您的应用程序 => 采样器 => CPU => CPU 样本。 在不同时间拍摄快照,并分析需要花费大量时间的地方。仅通过选中此设置,您将获得足够的数据进行优化。
注意:JvisualVm 属于 oracle jdk 8 发行版。 您只需在命令提示符/终端上键入 jVisualVM。 如果没有从这里下载