跳过机制的实现可以在FaultTolerantChunkProcessor和RetryTemplate中找到。
假设您配置了skippable exceptions,但没有配置retryable exceptions。并且您当前的块中有一个失败的项目导致异常。
现在,首先要写入整个块。在处理器的write() 方法中,您可以看到调用了RetryTemplate。它还获得了对 RetryCallback 和 RecoveryCallback 的两个引用。
切换到RetryTemplate。找到以下方法:
protected <T> T doExecute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback, RetryState state)
在那里你可以看到RetryTemplate 被重试,只要它没有用尽(即在我们的配置中恰好一次)。这样的重试将由可重试异常引起。不可重试的异常会立即中止这里的重试机制。
重试用尽或中止后,将调用RecoveryCallback:
e = handleRetryExhausted(recoveryCallback, context, state);
这就是单项处理模式现在开始的地方!
RecoveryCallback(在处理器的write() 方法中定义!)将锁定输入块(inputs.setBusy(true))并运行其scan() 方法。在那里你可以看到,一个项目是从块中取出的:
List<O> items = Collections.singletonList(outputIterator.next());
如果ItemWriter 可以正确处理此单个项目,则该块将完成并且ChunkOrientedTasklet 将运行另一个块(用于下一个单个项目)。这将导致对RetryCallback 的常规调用,但由于该块已被RecoveryTemplate 锁定,因此将立即调用scan() 方法:
if (!inputs.isBusy()) {
// ...
}
else {
scan(contribution, inputs, outputs, chunkMonitor);
}
因此将处理另一个单个项目并重复此过程,直到原始块被逐项处理:
if (outputs.isEmpty()) {
inputs.setBusy(false);
就是这样。我希望你觉得这很有帮助。而且我更希望您可以通过搜索引擎轻松找到它,并且不要浪费太多时间,自己找到它。 ;-)