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。
我想到的一个选择是
- 创建
StaxEventItemWriter
- 创建具有
JpaPagingItemReader
的步骤的 3 个实例并将相应的 <queryX>...</queryX>
部分写入共享编写器
- 在
JobExecutionListener
中写<root>
和</root>
标签,所以步骤不关心信封
这里还有其他的考虑因素,比如它是否总是 3 个文件等。但总体思路是将处理器、步骤、作业、任务和侦听器之间的关注点分开,使每个执行一个明确的工作。
使用 JVisualVm 监控应用程序内部的瓶颈。
由于您说创建 20MB 的文件需要 59 分钟,因此您将更好地了解性能受到影响的地方。
打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 样本。
在不同的时间拍摄快照并分析它在哪里花费了很多时间。通过仅选中此选项,您将获得足够的数据进行优化。
注意:JvisualVm 属于 oracle jdk8 发行版。您可以简单地在命令 prompt/terminal 上键入 jvisualvm。如果不是从 here
下载
你的问题的第二种方法似乎是正确的方向,你可以创建 3 个不同的 readers/processors/writers 并创建你的自定义编写器,它应该扩展允许 setAppend 的 AbstractFileItemWriter。此外,我已经看到 xmlWriter 编写的 xml 比 StaxEventItemWriter 更快,但是在编写样板代码时有一些折衷。
我是 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。
我想到的一个选择是
- 创建
StaxEventItemWriter
- 创建具有
JpaPagingItemReader
的步骤的 3 个实例并将相应的<queryX>...</queryX>
部分写入共享编写器 - 在
JobExecutionListener
中写<root>
和</root>
标签,所以步骤不关心信封
这里还有其他的考虑因素,比如它是否总是 3 个文件等。但总体思路是将处理器、步骤、作业、任务和侦听器之间的关注点分开,使每个执行一个明确的工作。
使用 JVisualVm 监控应用程序内部的瓶颈。 由于您说创建 20MB 的文件需要 59 分钟,因此您将更好地了解性能受到影响的地方。
打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 样本。 在不同的时间拍摄快照并分析它在哪里花费了很多时间。通过仅选中此选项,您将获得足够的数据进行优化。
注意:JvisualVm 属于 oracle jdk8 发行版。您可以简单地在命令 prompt/terminal 上键入 jvisualvm。如果不是从 here
下载你的问题的第二种方法似乎是正确的方向,你可以创建 3 个不同的 readers/processors/writers 并创建你的自定义编写器,它应该扩展允许 setAppend 的 AbstractFileItemWriter。此外,我已经看到 xmlWriter 编写的 xml 比 StaxEventItemWriter 更快,但是在编写样板代码时有一些折衷。