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

时间:2019-12-06 06:32:49

标签: java spring spring-batch

我是Spring Batch的新手,我有一个特殊的问题。我想使用JpaPagingItemReader从3个不同的jpa查询中获取结果,并分别对其进行处理,然后使用StaxEventItemWriter将其写入一个合并的XML文件中。

例如,生成的XML看起来像

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

请让我知道如何实现此目标?

此外,我目前使用一个查询实现了我的配置器,但读取器/写入器也相当慢。到目前为止,与单线程环境相比,在单线程环境中运行时,生成20MB的文件花了大约59分钟。如果周围还有其他建议,请告诉我。谢谢。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我头上的一个选择是

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

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

答案 2 :(得分:0)

使用 JVisualVm 监视应用程序内部的瓶颈。 由于您说创建20MB的文件花费了59分钟的时间,因此您将获得有关性能提高的更好的见解。

VisualVm tutorial

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

注意:JvisualVm属于oracle jdk 8发行版。您只需在命令提示符/终端上键入jvisualvm。如果不是从here下载

相关问题