【问题标题】:Spring batch best practice regarding data between steps [closed]关于步骤之间数据的 Spring Batch 最佳实践 [关闭]
【发布时间】:2016-03-22 21:49:10
【问题描述】:

我们有一个旧代码库,我认为可以通过选择一个好的批处理框架来改进它。

我已经开始尝试使用 Spring Batch,并决定(在阅读了有关它的文档、多本书籍和论坛之后)感受它的最佳方式是实际使用它,所以我重新开发了一些我们现有的应用到 Spring Batch。

这是我重新开发的简单应用程序:

  • 从表中读取行并将行解析为 POJO
  • 如果满足给定条件,则忽略列表中的项目
  • 从解析列表中写入文件
  • 将文件上传到 FTP
  • 如果 FTP 上传成功,则将已解析列表的元素标记为在 db 中处理

现在,我已经创建了一个包含 3 个步骤的作业:

Step1 是:读取行到 POJO(读取器,在这种情况下基于 jdbc),排除项目(处理器),写入文件(写入器)。简单的。 :)

Step2: tasklet 上传到 FTP

Step3:现在,这就是我遇到麻烦的地方。我需要重用 Step1 中的 POJO 列表。

我的理解是我有两个选择:

1) 使用 StepExecutionContext,将 List 保存在那里,并使用 ExecutionContextPromotionListener 实现在 Step1 和 Step2 以及 Step2 和 Step3 之间传递列表。

2)这次我使用相同的读取器和处理器,但使用不同的写入器。

我不太喜欢这两种方法

1) 看起来很乱,我在多个地方读到过在这种情况下放更大的东西不是一个好习惯(我的列表将包含 5-10000 个对象)

2) 似乎是一种资源浪费,也是一种不好的做法。在这种情况下,我可以侥幸逃脱,但在更复杂的读取器/处理器的情况下,这将是一个非常糟糕的重复工作。

做我想做的事情的最佳方法是什么? 我在这里正确使用 Spring Batch 吗?

【问题讨论】:

    标签: java spring design-patterns spring-batch


    【解决方案1】:

    这就是我构建工作步骤的方式。

    1. 读取:数据库 写入:File1
    2. 读取:文件 1 过程:跳过过滤器 写入:文件2
    3. FTP 使用系统命令小任务
    4. 读取:文件 1 或文件 2 写入:数据库

    我添加了一个步骤来防止在执行下游步骤时更改数据库。

    【讨论】:

    • 是的,这可能比我的两个选项更好。 :) 不过,我需要遍历我之前创建的文件,所以它会更慢而且有点浪费。你认为我正确地接近 Spring 批处理吗?
    • 还有一件事:我不会使用 System Command Tasklet,这会使我的代码依赖于它运行的服务器,我会编写自己的 Tasklet 来处理 FTP 上传。但这只是一个细节:)
    【解决方案2】:

    我一直在阅读“Spring Batch Essientials”一书,他们想到了使用“holder beans”来保存数据。注入 bean 来设置和获取数据。

    【讨论】:

    • 我唯一需要解决的是如何使这个解决方案线程安全。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多