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

时间:2016-03-22 21:49:11

标签: java spring design-patterns spring-batch

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

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

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

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

现在,我所做的是我通过3个步骤创建了一份工作:

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

Step2:要上传到FTP的tasklet

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

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

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

2)我使用相同的阅读器和处理器,这次使用不同的编写器。

我真的不喜欢这两种方法

1)看起来很乱,我在多个地方读过,在这种情况下放置更大的东西不是一个好习惯(我的清单会容纳5-10000个对象)

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

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

2 个答案:

答案 0 :(得分:2)

这就是我如何构建工作步骤。

  1. 阅读:DB 写:File1
  2. 阅读:File1 过程:SkipFilter 写:File2
  3. 使用System Command Tasklet的FTP
  4. 阅读:File1或File2 写:DB
  5. 在执行下游步骤时,我添加了一个防止数据库更改的步骤。

答案 1 :(得分:1)

我一直在阅读“Spring Batch Essientials”一书,他们有想法使用“持有者bean”来保存数据。注入bean来设置并获取数据。