while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {
try {
if (this.logger.isDebugEnabled()) {
this.logger.debug("Retry: count=" + context.getRetryCount());
}
// Reset the last exception, so if we are successful
// the close interceptors will not think we failed...
lastException = null;
return retryCallback.doWithRetry(context);
}
catch (Throwable e) {
lastException = e;
try {
registerThrowable(retryPolicy, state, context, e);
}
catch (Exception ex) {
throw new TerminatedRetryException("Could not register throwable",
ex);
}
finally {
doOnErrorInterceptors(retryCallback, context, e);
}
...
}
你得把它改成。。。
while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {
try {
if (this.logger.isDebugEnabled()) {
this.logger.debug("Retry: count=" + context.getRetryCount());
}
// Reset the last exception, so if we are successful
// the close interceptors will not think we failed...
lastException = null;
T result = retryCallback.doWithRetry(context);
if (((Optional<String>) result).get() == null) {
try {
registerThrowable(retryPolicy, state, context, someDummyException);
}
catch (Exception ex) {
throw new TerminatedRetryException("Could not register throwable",
ex);
}
finally {
doOnErrorInterceptors(retryCallback, context, e);
}
...
}
else {
return result;
}
}
catch (Throwable e) {
...
}
4条答案
按热度按时间juzqafwq1#
我一直在使用故障保护内置重试。可以基于 predicate 和异常重试。
您的代码如下所示:
如果可选值不为空,则输出为:
否则看起来像:
5cnsuln72#
我目前自己为此编写了一个util(vanilla java),其他答案非常受欢迎:
使用此代码,我的方法如下所示:
0ejtzxu13#
@Retryable
(以及潜在的RetryTemplate
)完全基于例外。你可以把
RetryTemplate
,覆盖doExecute()
检查返回值。您可能需要复制方法中的大部分代码;它并不是专门用来覆盖
retryCallback.doWithRetry()
打电话。您可以使用自定义
RetryTemplate
在一个RetryOperationsInterceptor
(见@Retryable
在interceptor
属性)。编辑
电流
RetryTemplate
代码看起来像这样。。。你得把它改成。。。
哪里
someDummyException
就是欺骗上下文使计数器递增。它可以是一个static
字段,只创建了一次。6ioyuze24#
如果结果不理想,就抛出异常