【发布时间】: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