Spring Batch - 在作业运行中间导入数据时

时间:2017-02-05 00:26:20

标签: java spring-batch

假设一个作业实例当前正在运行,并且正在对前1000条记录进行读/处理/写入操作。在此期间,另有1000条记录导入数据库。在这种情况下,处理1000条记录后,应完成第一个作业实例(假设没有失败)。第二个实例应该触发并处理下一个1000条记录。有可能吗?

或者我是否有责任继续处理剩余1000条记录的步骤(意味着另一个步骤实例将启动并执行)?

1 个答案:

答案 0 :(得分:2)

是的,有可能。它取决于您如何定义选择。

例如,如果使用JdbcCursorItemReader,则select ist在最开始执行,因此,选择并处理此时出现的所有行。 在处理批处理期间添加的行不是此选择的一部分。

使用JdbcPagingItemReader不同地工作,因为它对每个处理的块执行查询。因此,有可能选择在批处理过程中插入的数据。 但是,这可能是一个关于可重启性的问题,并确保所有元素都将被处理。因此,在使用PagingItemReader时,您必须确保查询为每个块选择相同的数据(分页阅读器处理内部状态,这有助于每个块接收新行)。 你可以通过拥有依赖于插入行的时间戳的where子句的一部分来确保这一点,或者你添加一个状态列,并且在第一步中,你只需将当时可用的所有条目的状态设置为某种东西喜欢" toProcess"。此外,您对Reader的查询只需要选择这些条目。当然,一旦处理完条目,您还必须更新状态。