当Tasklet#execute应该返回CONTINUABLE吗?

时间:2019-09-10 14:32:02

标签: java spring-batch spring-batch-tasklet

我读了that

  

在Tasklet实现中完成处理后,您将返回   org.springframework.batch.repeat.RepeatStatus对象。那里有两个   此选项:RepeatStatus.CONTINUABLE和RepeatStatus.FINISHED。   乍看之下,这两个值可能会造成混淆。如果你回来   RepeatStatus.CONTINUABLE,不是说作业可以继续。   您要告诉Spring Batch重新运行Tasklet。说,   例如,您想循环执行一个特定的tasklet   直到满足特定条件为止,但您仍然想使用Spring   批处理以跟踪执行Tasklet的次数,   交易等等。您的tasklet可能会返回   RepeatStatus.CONTINUABLE,直到满足条件为止。如果你回来   RepeatStatus.FINISHED,表示此任务集的处理是   完成(无论成功与否),并继续进行下一部分   处理。

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

2 个答案:

答案 0 :(得分:0)

这使您可以在多个迭代中分解复杂任务的处理。

该功能类似于带有继续/中断功能的while(true)循环。

答案 1 :(得分:0)

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

但是,这不可能以一种很好的方式使用Spring Batch的Reader / Processor / Writer API来实现,因为Processor是逐项而不是整块地馈送的。实际上只有作家能看到大量的物品。

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

相关问题