Pet*_*ann 10 fallback skip chunks spring-batch
我想知道我是如何确定我的ItemWriter,Spring Batch当前是处于块处理模式还是处于后备单项处理模式.首先,我没有找到关于如何实现这种回退机制的信息.
即使我还没有找到解决我实际问题的方法,我想和你分享我对回退机制的了解.
如果我遗漏了任何内容,请随意添加附加信息的答案;-)
Pet*_*ann 15
可以在FaultTolerantChunkProcessor和RetryTemplate中找到跳过机制的实现.
我们假设您配置了可跳过的异常但没有可重试的异常.并且当前块中存在一个失败的项目导致异常.
现在,首先要写出整个块.在处理器的write()方法中,您可以看到a RetryTemplate被调用.它还获得了对a RetryCallback和a的两个引用RecoveryCallback.
切换到RetryTemplate.找到以下方法:
protected <T> T doExecute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback, RetryState state)
Run Code Online (Sandbox Code Playgroud)
在那里你可以看到,RetryTemplate只要它没有耗尽(即我们的配置中只有一次),它会被重试.这种重试将由可重试的异常引起.不可重试的异常将立即中止重试机制.
重试耗尽或中止后,RecoveryCallback将调用:
e = handleRetryExhausted(recoveryCallback, context, state);
Run Code Online (Sandbox Code Playgroud)
这就是单项处理模式现在开始的地方!
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);
}
Run Code Online (Sandbox Code Playgroud)
因此,将处理另一个单项,并重复此操作,直到逐个项目处理原始块:
if (outputs.isEmpty()) {
inputs.setBusy(false);
Run Code Online (Sandbox Code Playgroud)
而已.我希望你发现这很有帮助.而且我更希望你能通过搜索引擎轻松找到这个并且不会浪费太多时间,自己找出来.;-)
| 归档时间: |
|
| 查看次数: |
8519 次 |
| 最近记录: |