Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring@Retryable中针对不同异常的不同重试尝试_Spring_Spring Retry - Fatal编程技术网

Spring@Retryable中针对不同异常的不同重试尝试

Spring@Retryable中针对不同异常的不同重试尝试,spring,spring-retry,Spring,Spring Retry,在我的SpringBoot应用程序中,我有一个客户端,可以发送POST请求。在POST期间,它可能有几个例外 我希望在出现两种不同的异常时有一个重试逻辑。但在某种程度上,最大重试次数应该对每个异常生效,而不是同时生效。很难解释,但举个例子: 最大重试次数配置为3次。如果我得到exception1类型,而不是retry,我还有2次retry。请再试一次并获取例外1,然后重试,现在我还有1次重试。再试一次,现在我得到异常2,再试一次,现在我还有2次重试,因为之前的重试是针对异常1的,而不是针对异常2

在我的SpringBoot应用程序中,我有一个客户端,可以发送POST请求。在POST期间,它可能有几个例外

我希望在出现两种不同的异常时有一个重试逻辑。但在某种程度上,最大重试次数应该对每个异常生效,而不是同时生效。很难解释,但举个例子:

最大重试次数配置为3次。如果我得到exception1类型,而不是retry,我还有2次retry。请再试一次并获取例外1,然后重试,现在我还有1次重试。再试一次,现在我得到异常2,再试一次,现在我还有2次重试,因为之前的重试是针对异常1的,而不是针对异常2的。因此,异常2重试刚刚开始

可能吗?我尝试过这样做,但这不会重新开始对不同异常的重试尝试,如果发生了异常1,然后又发生了异常2,则我还有1次重试:

@Retryable(maxAttempts = 3, value = {Exception1.class, Exception2.class}, backoff = @Backoff(delay = 3000, multiplier = 2))

您必须创建一个自定义重试策略;并将其配置为
RetryTemplate
RetryOperationsInterceptor
;使用注释上的
拦截器
属性引用拦截器。

我认为@Retryable注释不存在任何内容。如果选择使用RetryTemplate实现,则可以使用以下命令对不同的异常进行不同的重试尝试,并将其设置到RetryTemplate对象中:

final SimpleRetryPolicy simpleRetryPolicyTenTimes = new SimpleRetryPolicy();
simpleRetryPolicyTenTimes.setMaxAttempts(10);
final SimpleRetryPolicy simpleRetryPolicyTwoTimes = new SimpleRetryPolicy();
simpleRetryPolicyTwoTimes.setMaxAttempts(2);
final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
policyMap.put(RetryException.class, simpleRetryPolicyTenTimes);
policyMap.put(HardFailException.class, simpleRetryPolicyTwoTimes);
final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
retryPolicy.setPolicyMap(policyMap);
return retryPolicy;
final simpleretropolicy simpleretropolicytimes=new simpleretropolicy();
simpleRetryPolicyTenTimes.setmaxtures(10);
最终SimpleRetryPolicy simpleRetryPolicyTwoTimes=新SimpleRetryPolicy();
SimpleRetryPolicyTwo倍。setMaxAttempts(2);

最后的地图你有什么例子吗?因为我找不到合适的例子,有不同的例外情况,可以像我描述的那样行动;正如我所说,您需要创建一个自定义策略来添加该逻辑。