Spring Batch中的跳转是如何实现的? [英] How is the skipping implemented in Spring Batch?

查看:14
本文介绍了Spring Batch中的跳转是如何实现的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何在我的ItemWriter中确定Spring Batch当前是处于块处理模式还是处于后备单项处理模式。首先,我没有找到这个后备机制是如何实现的信息。

即使我还没有找到我的实际问题的解决方案,我也愿意与您分享我关于后备机制的知识。

如果我遗漏了任何内容,请随时添加带有附加信息的答案;-)

推荐答案

跳过机制的实现可以在FaultTolerantChunkProcessorRetryTemplate中找到。

假设您配置了skippable exceptions,但没有配置retryable exceptions。并且您的当前区块中存在导致异常的失败项目。

现在,首先要写出整个块。在处理器的write()方法中,您可以看到调用了RetryTemplate。它还获取对RetryCallbackRecoveryCallback的两个引用。

切换到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);

就是这样。我希望这对你有帮助。我更希望大家可以通过搜索引擎很容易的找到,不要浪费太多的时间,自己去找出来。;-)

这篇关于Spring Batch中的跳转是如何实现的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆