Java 关于步骤间数据的Spring批处理最佳实践

Java 关于步骤间数据的Spring批处理最佳实践,java,spring,design-patterns,spring-batch,Java,Spring,Design Patterns,Spring Batch,我们有一个旧的代码库,我认为通过选择一个好的批处理框架可以大大改进它 我已经开始尝试SpringBatch,并决定(在阅读了文档、多本书和论坛后)了解SpringBatch的最好方法是实际使用它,因此我将我们现有的一些应用程序重新开发为SpringBatch 以下是我重新开发的简单应用程序: 从表中读取行并将行解析为POJO 如果满足给定条件,则忽略列表中的项目 从解析列表中写入文件 将文件上载到FTP 如果FTP上载成功,则将已解析列表的元素标记为已在数据库中处理 现在,我所做的是创建了一

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

我已经开始尝试SpringBatch,并决定(在阅读了文档、多本书和论坛后)了解SpringBatch的最好方法是实际使用它,因此我将我们现有的一些应用程序重新开发为SpringBatch

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

  • 从表中读取行并将行解析为POJO
  • 如果满足给定条件,则忽略列表中的项目
  • 从解析列表中写入文件
  • 将文件上载到FTP
  • 如果FTP上载成功,则将已解析列表的元素标记为已在数据库中处理
现在,我所做的是创建了一个包含3个步骤的作业:

步骤1是:将行读取到POJO(读取器,本例中基于jdbc),排除项(处理器),写入文件(写入器)。简单。:)

步骤2:要上载到FTP的tasklet

第三步:现在,这就是我遇到麻烦的地方。我需要重用步骤1中的POJO列表

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

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

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

这两种方法我都不喜欢

1) 看起来很混乱,我在多个地方读到,在这种情况下放置更大的对象不是一个好的做法(我的列表将容纳5-10000个对象)

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

做我想做的事情最好的方法是什么?
我在这里是否正确使用了Spring批处理?

这就是我将如何构造作业步骤的方法

  • 读:DB 写入:文件1
  • 阅读:文件1 工艺:SkipFilter 写入:文件2
  • 使用系统命令Tasklet的FTP
  • 读取:文件1或文件2 写入:DB

  • 我添加了一个步骤,以防止在执行下游步骤时DB发生变化。

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

    是的,这可能比我的两个选项要好。:)但是,仍然需要遍历我以前创建的文件,因此速度会慢一些,而且有点浪费。你认为我处理Spring批处理的方法正确吗?还有一件事:我不会使用系统命令Tasklet,这会使我的代码依赖于它运行的服务器,我会编写自己的Tasklet来处理FTP上传。但这只是一个细节:)我唯一需要解决的是如何使此解决方案线程安全。:)