问题描述
我需要将一些旧的 java 批次迁移到 spring 批次。这些旧批次正在读取大型 XML 文件 ( >1gb ) 并将它们拆分为小型 XML 文件。所以我们有以下场景:
- 输入:Big1File.xml -> 输出:Small1.1File.xml、Small1.2File.xml、 Small1.3File.xml
- 输入:Big2File.xml -> 输出:Small2.1File.xml,Small2.2File.xml
- 输入:Big3File.xml -> 输出:Small3.1File.xml、Small3.2File.xml、 Small3.3File.xml,Small3.4File.xml
这个xml文件的结构总是一样的:
<?xml version="1.0"?>
<info>
<header>
<headerField1></headerField1>
<headerField2></headerField2>
</header>
<elements>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
....
</elements>
</info>
我一直在阅读有关 StaxEventItemReader 和 StaxEventItemWriter 的文档和示例,但我不确定是否可以使用 Writer 的默认版本。
StaxEventItem 类是否是拆分此类 xml 文件的好选择?
通常示例是没有标题元素的 xml,基本上是带有元素列表的 xml:
<?xml version="1.0"?>
<info>
<elements>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
<element>
<elementField1></elementField1>
<elementField2></elementField2>
<elementField3></elementField3>
</element>
....
</elements>
</info>
如果我没有错,我需要做的是扩展 StaxEventItemWriter,然后我就可以为每个输出文件添加标题,我正确吗?
解决方法
您可以使用委托给 StaxEventItemWriter
的 MultiResourceItemWriter。要限制每个文件的元素数量,您可以将 itemCountLimitPerResource
参数设置为 5000。
对于标头,您需要创建一个单独的步骤,从文件中动态提取它并将其传递给委托编写器。我与平面文件编写器 here 分享了一个示例,但您可以将其改编为 xml 编写器。