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

Java Spring批处理—在作业运行期间导入数据时 假设作业实例当前正在运行,并且处于前1000个记录的读取/进程/写入操作的中间。在此期间,又有1000条记录导入数据库。在这种情况下,第一个作业实例应该在处理1000条记录后完成(假设没有失败)。第二个实例应该触发并处理下1000条记录。可能吗,java,spring-batch,Java,Spring Batch,或者我必须将剩余1000条记录的责任留给步骤来处理(意味着另一个步骤实例将启动并执行)?是的,这是可能的。它取决于您如何定义选择 例如,如果使用JdbcCursorItemReader,则select列表在最开始时执行,因此,此时存在的所有行都将被选中并进行处理。 在批处理过程中添加的行不属于此选择的一部分 使用JdbcPagingItemReader的工作原理不同,因为它对处理的每个块都执行查询。因此,有可能选择批处理过程中插入的数据。 但是,这可能是一个有关可重启性和确保所有元素都将被处理的

或者我必须将剩余1000条记录的责任留给步骤来处理(意味着另一个步骤实例将启动并执行)?

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

例如,如果使用JdbcCursorItemReader,则select列表在最开始时执行,因此,此时存在的所有行都将被选中并进行处理。 在批处理过程中添加的行不属于此选择的一部分

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

JdbcCursorItemReader角度上的一个小提示。重新启动将包括新记录。这个答案的
JdbcPagingItemReader
部分提到的state列是推荐给两位读者的。谢谢Hansjoerg&Michael