【问题标题】:Chunk processing in Spring Batch effectively limits you to one step?Spring Batch 中的块处理有效地将您限制在一步?
【发布时间】:2012-03-01 07:03:42
【问题描述】:

我正在编写一个 Spring Batch 应用程序来执行以下操作:有一个输入表 (PostgreSQL DB),有人不断向其中添加行 - 这基本上是添加的工作项。对于这些行中的每一行,我需要从另一个数据库中获取更多数据,进行一些处理,然后执行一个输出事务,该事务可以是多个 SQL 查询,涉及多个表(出于一致性原因,这需要是一个事务)。

现在,输入和输出之间的部分应该是模块化的——它已经有 3-4 个逻辑分离的东西,将来还会更多。这个流程不必是线性的——接下来要做什么处理可以取决于之前的结果。简而言之,这基本上就像您可以使用作业中的步骤设置的流程。

我的主要问题是:通常单个块处理步骤同时具有 ItemReader 和 ItemWriter,即在一个步骤中输入到输出。那么,我是否应该将所有处理步骤作为单个 ItemProcessor 的一部分包含在内?如何使单个 ItemProcessor 本身成为有状态的工作流?

另一种选择是让每一步都成为一个 Tasklet 实现,并自己编写两个 tasklet 来充当 ItemReader 和 ItemWriter。

有什么建议吗?

【问题讨论】:

  • 我的第一个想法是这不是批处理应用程序,但我可能错了。听起来这个过程没有任何开始或停止,而且似乎没有任何参数可以用来定义“工作”。这听起来像是一个简单的 Java 应用程序。您查看 Spring Batch 有什么特别的原因吗?
  • 作为一个“简单的 Java 应用程序”,你会如何做?

标签: jdbc spring-batch


【解决方案1】:

找到了答案 - 是的,您实际上仅限于一个步骤。但是:

1) 对于线性工作流,您可以“链接”项目处理器 - 即创建一个复合项目处理器,您可以向其提供所有通过 applicationContext.xml 执行实际工作的项目处理器。 Composite itemprocessor 只是一个一个地运行它们。这就是我现在正在做的事情。

2) 您始终可以将内部子流创建为单独的 spring 批处理工作流,并通过类似于上述复合 itemprocessor 的 itemprocessor 中的代码调用它。我将来可能会搬到这里。

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多