什么时候 Tasklet#execute 应该 return CONTINUABLE?

When Tasklet#execute should return CONTINUABLE?

我读了that:

When processing is complete in your Tasklet implementation, you return an org.springframework.batch.repeat.RepeatStatus object. There are two options with this: RepeatStatus.CONTINUABLE and RepeatStatus.FINISHED. These two values can be confusing at first glance. If you return RepeatStatus.CONTINUABLE, you aren't saying that the job can continue. You're telling Spring Batch to run the tasklet again. Say, for example, that you wanted to execute a particular tasklet in a loop until a given condition was met, yet you still wanted to use Spring Batch to keep track of how many times the tasklet was executed, transactions, and so on. Your tasklet could return RepeatStatus.CONTINUABLE until the condition was met. If you return RepeatStatus.FINISHED, that means the processing for this tasklet is complete (regardless of success) and to continue with the next piece of processing.

但我无法想象使用此功能的示例。你能为我解释一下吗?下次什么时候调用tasklet?

这允许您将复杂任务的处理分解为多个迭代。

功能类似于 continue/break 的 while(true) 循环。

假设您有一大组项目(例如文件),您需要以某种方式丰富其中的每一个,这需要使用外部服务。外部服务可能会提供一种分块模式,可以一次处理多达 1000 个请求,而不是对每个文件进行单独的远程调用。这可能是将整体处理时间降低到所需水平的唯一方法。

但是,使用 Spring 批处理的 Reader/Processor/Writer API 无法很好地实现这一点,因为处理器是逐项输入的,而不是整块输入的。只有作者才能真正看到项目块。

您可以使用 Tasklet 来实现此目的,该 Tasklet 最多读取下一个 1000 个未处理的文件、向服务发送分块请求、处理结果、写入输出文件并删除或移动已处理的文件。 最后它检查是否还有更多未处理的文件。根据它 returns FINISHED 或 CONTINUABLE,在这种情况下,框架将再次调用 Tasklet 来处理下一个最多 1000 个文件。 这实际上是一个非常现实的场景,所以我希望能说明该功能的目的。