Spring Batch中的块处理有效地限制了您一步到位?

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

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

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

另一个选择是使每个步骤成为Tasklet实现,并自己编写两个tasklet以表现为ItemReader和ItemWriter .

有什么建议?

回答(1)

2 years ago

找到答案 - 是的,你实际上只限于一步 . 但:

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

2)您始终可以将内部子流创建为单独的 spring 批处理工作流,并通过类似于上面的复合迭代处理器的迭代处理器中的代码调用它 . 我将来可能会转向这个 .