2

我读到

在您的 Tasklet 实现中完成处理后,您将返回一个 org.springframework.batch.repeat.RepeatStatus 对象。有两个选项:RepeatStatus.CONTINUABLE 和 RepeatStatus.FINISHED。乍一看,这两个值可能会令人困惑。如果您返回 RepeatStatus.CONTINUABLE,您并不是说该作业可以继续。您正在告诉 Spring Batch 再次运行 tasklet。比如说,你想在一个循环中执行一个特定的 tasklet,直到满足给定的条件,但你仍然想使用 Spring Batch 来跟踪 tasklet 的执行次数、事务等等。您的 tasklet 可以返回 RepeatStatus.CONTINUABLE 直到满足条件。如果您返回 RepeatStatus.FINISHED,

但我无法想象使用此功能的示例。你能给我解释一下吗?下一次 tasklet 何时被调用?

4

2 回答 2

3

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

但是,这不可能以一种很好的方式使用 Spring Batch 的 Reader/Processor/Writer API 来实现,因为处理器是逐项提供的,而不是它们的整个块。只有 Writer 才能真正看到大块的项目。

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

于 2019-09-12T07:35:22.097 回答
1

这使您可以跨多次迭代分解复杂任务的处理。

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

于 2019-09-10T14:37:53.510 回答