微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Batch:动态或旋转作家

如何解决Spring Batch:动态或旋转作家

我正在尝试进行下一个实现。

由于大小原因,我必须将我的输出文件拆分为例如 10k 行块。

所以,我需要在文件“out1.csv”中转储 10k,在文件“out2.csv”中转储下一个 10k,依此类推。

通过一个输出文件,具有读写器-处理器-写入器的模式批处理块非常简单直接。

输出流在块内的batch:streams XML 部分中打开,因此我避免了 “Writer 必须打开才能写入”异常。

我想做一个避免这种严格和预设的解决方案的实现:

<batch:chunk reader="reader"  writer="compositeWriter" commit-interval="10000" processor-transactional="false">
    <batch:streams>
        <batch:stream ref="writer1" />
        <batch:stream ref="writer2" />
        <batch:stream ref="writer3" />
        .
        .
        .<batch:stream ref="writer20" />
    </batch:streams>
</batch:chunk>

<bean id="writer1" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
        <property name="resource" value="out1.csv" />
        ...
</bean>

<bean id="writer2" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
        <property name="resource" value="out2.csv" />
        ...
</bean>

...
<!-- writer 20 -->

假设20个作家就足够了。 我正在寻找一种解决方案来动态(可能以编程方式)创建输出编写器,打开它们并避免上述异常。

解决方法

由于大小原因,我必须将我的输出文件分成 10k 行块。因此,我需要在文件“out1.csv”中转储 10k,在文件“out2.csv”中转储下一个 10k,依此类推。

您似乎在使用 CompositeItemWriter,但这不是正确的方法。您需要使用的是 MultiResourceItemWriter ,它允许您按项目计数拆分输出。在您的情况下,您需要配置 MultiResourceItemWriter 并将 itemCountLimitPerResource 设置为 10.000。您还可以提供 ResourceSuffixCreator 以自定义输出文件名,例如 out1.csvout2.csv 等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。