【问题标题】:Spring batch job step up defenitionSpring批处理作业升级定义
【发布时间】:2022-02-07 11:27:51
【问题描述】:

我正在开发一个 Spring Batch 应用程序,顺便说一下我是新手。

我制作了一些教程,并阅读了一些文档,以便为这一发展做好准备。 我已经对一些最常见的 API(ItemRead、ItemProcessor、ItemWriter、Setps、Tasklets、Jobs、Parameters...)感到“满意”

我的要求很简单。

1 - 从 CSV 文件中读取一些数据。

2 - 通过 CSV 文件的每一行从数据库中获取一个实体。

3 - 更新实体的状态。

4 - 导出一个新的 CSV 文件,其中包含来自每个实体的一些生成数据。

我的问题不是如何获取、如何更新或如何导出 csv 文件,而是如何设置我的 JOB。

在我看来,我喜欢以这样的工作结束

1 - ItemRead -> 读取整个 csv 文件。

2 - ItemProcessor -> 更新实体。

3 - ItemWriter -> 持久化实体。

4 - ItemWriter -> 根据实体状态导出新的CSV文件。

这有意义吗?有更好的方法。我是否遗漏了一些陷阱?

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    逐行更新可能不是最好的主意。相反,我建议

    工作 1

    1. 读取整个文件
    2. 将其写入 tmp 表

    这里写更新查询,根据主键连接原始表和tmp表。

    查询执行后,调用第二个作业

    工作 2

    1. 从表中读取记录
    2. 将其写入文件

    最后为下一个作业序列清除 tmp 表。

    这个答案是基于我的思考过程。可能还有其他最佳方法。

    【讨论】:

    • 我使用的是基于块的方法,因此实际上写入过程不是逐行而是逐块,这是可配置的。在我的情况下设置为 1000。我认为我真的必须这样做(只需使用两个 ItemWriter 的一个步骤)来保持写入 db 和写入 csv 文件在同一个事务 bundery 中。
    • 我最终实现了一个自定义 CompositeItemWriter。我在其他线程中看到,我认为这是我需要的。
    • 好的@BrunoMiguel,我认为即使使用块也是..要更新表,您需要使用Id获取记录,设置值然后合并您需要为所有记录执行的操作。如果文件很大,那么它会很昂贵。在我的方法中..工作是分开的,所以将来如果您需要在读取分隔符之类的文件时修改某些内容,则无需触摸更新查询和作业 2。如果写入 CSV 文件也需要更改,则无需触摸其他两个问题,因此,您已将每个关注点分开。如果将来有任何错误,那么您可以使用这种方法轻松检查。
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 2014-08-10
    • 2018-05-22
    • 2020-08-29
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多