【问题标题】:Writing in the same files using Spring Batch使用 Spring Batch 写入相同的文件
【发布时间】:2023-01-22 11:19:44
【问题描述】:

我正在尝试构建批处理应用程序,我将从一些文件夹中选择文件,使用名称过滤它们,使用 MultiResourceItemReader 将它们传递给批处理操作。然后我将实现我自己的ItemProcessor,以根据某些条件更改几行。

我的要求是将更新的数据写入我从中获取输入的相同文件中,我不知道我们是否真的可以使用 Spring Batch 做到这一点。

所以基本上我想不出如何在这里实现ItemWriter,因为我需要将数据写入同一个文件,同时写入多个文件。

我猜这里可以使用 ClassifierCompositeItemWriter 或 MultiResourceItemWriter,我试图在不同的 stackoverflow 答案中阅读它们,但找不到与我的要求相关的任何内容。

谁能帮我实现这个。

代码示例真的很有帮助。

谢谢

【问题讨论】:

    标签: spring-boot csv spring-batch


    【解决方案1】:

    虽然这在技术上应该是可行的,但我不确定这对可重启性来说是个好主意。如果出现问题,你会怎么做?输入文件将被新数据覆盖,您将丢失原始项目。

    我可能在这里遗漏了一些东西,但我认为没有理由不保留原始文件,可以在作业结束的最后一步用相同的名称重命名新文件之前删除原始文件(在所有处理之后)已成功完成)。

    【讨论】:

    • 好的!所以没有办法编辑我猜的文件,我将不得不创建新文件并用更新的值写入所有数据。但是如何将数据写入多个文件,根据你的说法,我需要为每个文件创建新文件并将数据写入它们,我想不出我将如何在这里实现 ItemWriter,是否提供了任何 ItemWriter 实现通过春季批处理这个要求?谢谢
    • Spring Batch 没有开箱即用的项目编写器,您需要一个自定义的来满足您的特定需求。
    • 我们可以在这里使用分区吗? [链接]docs.spring.io/spring-batch/docs/current/reference/html/…
    【解决方案2】:

    分区可以在这里使用,我不知道这是否是正确的方法,但它在我的情况下工作得很好。

    1. 首先,我使用MultiResourcePartitioner为3种类型的文件创建了3组Partitioners。我使用 nio.Files 类从文件系统中过滤文件,并将文件集合提供给 MultiResourcePartitioner。它会自动为每个文件创建分区程序。
    2. 然后我为每个分区器编写读取器、写入器和处理器。在 Reader 中,我从 stepExecutionContext 和 @StepScope 注释中动态选择文件名,在 writer 中,我使用临时文件名来存储输出。
    3. 最后我创建了一个 Tasklet 来删除原始文件并重命名临时文件。

      阅读有关分区和并行处理的文档,您将知道它是否适用于您的情况 [doc]:https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#partitioning

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 1970-01-01
        相关资源
        最近更新 更多