Python中@retry是个类吗

Python中@retry是个类吗,第1张

retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便。

retry模块中retry()的基本用法:retry()的功能是在其装饰的函数运行报错后重新运行该函数,retry()有几个主要参数:

exceptions:传入指定的错误类型,默认为Exception,即捕获所有类型的错误,也可传入元组形式的多种指定错误类型

tries:定义捕获穗斗错误之后重复运行次数,默认为-1,即为无数次

delay:定义每次重复运行之间樱族顷的停顿时长,单位脊陆秒,默认为0,即无停顿

retry 是个标志符,表示代码从哪里开始执行...一般很少蠢局用的....

public class Demo {

public static void main(String args[]) {

// retry: // 1

for(int i = 0i <10i++) {

retry: // 2

while(i == 5) {

continue retry

}

System.out.print(i + " ")

}

}

}

// 1 :retry: -->结果为: 0 1 2 3 4 6 7 8 9

/好局/ 2 :retry: -->结果为:0 1 2 3 4

//所以retry的意思就是友档让说从哪开始执行代码,你可以自己试试/

在启动类中使用@EnableRetry注解

需要在重试的代码中加入重试注解 @Retryable

默认情况下,会重试3次,间隔1秒

我们可以从注解 @Retryable 中看到

我们来运行测试代码

运行结果如下:

可以看到重新执行了3次 service1() 方法,然后间隔是1秒,然后最后还是重试失败,所以抛出了异常

既然我们看到了注解 @Retryable 中有这么多参数可以设置,那我们就来介绍几个常用的配置。

首先是 maxAttempts ,用于设置重试次数

从运行结果可以看到,方法执行了5次。

下面来介绍 maxAttemptsExpression 的设置

maxAttemptsExpression 则可以使用表达式,比如上述就是通过获取配置中maxAttempts的值,我们可以在application.yml设置。上述其实省略掉了SpEL表达式 #{....} ,运行结果的话可以发现方法执行了4次..

我们可以使用SpEL表达式

接着我们下面来看看 exceptionExpression , 一样也是写SpEL表达式

上面伏察缓的表达式 exceptionExpression = "message.contains('test')" 的作用其实是获取到抛出来exception的message(调用了 getMessage() 方法),然后判断message的内容里面是否包含了 test 字符串,如果包含的话就会执行重试。所以如果调用方法的时候传入的参数 exceptionMessage 中包含了 test 字符串的话就会执行重试。

但这里值得注意的是, Spring Retry 1.2.5之后 exceptionExpression 是可以省略掉 #{...}

使用1.2.5之后的版本运行是没有问题的

但是如果使用1.2.5版本之前包括1.2.5版本的话,运行的时候会报错如下:

还可以在表达式中执行一个方法,前提是方法的类在spring容器中注册了, @retryService 其实就是获取bean name为 retryService 的bean,然后调用里面的 checkException 方法,传入的参数为 #root ,它其实就是抛出来的exception对象。一样的也是可以省略 #{...}

运行结果:

当然还有更多表达式的用法了...

下面再来看看另一个配置 exclude

这个 exclude 属性可以帮我们排除一些我们不想重试的异常

最后我们来看看这个 backoff 重试等待策略, 默认使用 @Backoff 注解。

我们先来看看这个 @Backoff 的 value 属性,用于设置重试间隔

运行结果可以看出来没局重试的间隔为2秒

接下来介绍 @Backoff 的 delay 属性,它与 value 属性不能共存,当 delay 不设置的时候会去读 value 属性设置的值,如果 delay 设置的话则会忽略 value 属性

运行结果可以看出,重试的时间间隔为500ms

接下来我们来看``@Backoff 的 multiplier`的属性, 指定延迟倍数, 默认为0。

multiplier 设置为2,则表示第一次重试间隔为2s,第缺模二次为4秒,第三次为8s

运行结果如下:

接下来我们来看看这个 @Backoff 的 maxDelay 属性,设置最大的重试间隔,当超过这个最大的重试间隔的时候,重试的间隔就等于 maxDelay 的值

运行结果:

可以最后的最大重试间隔是5秒

当 @Retryable 方法重试失败之后,最后就会调用 @Recover 方法。用于 @Retryable 失败时的“兜底”处理方法。 @Recover 的方法必须要与 @Retryable 注解的方法保持一致,第一入参为要重试的异常,其他参数与 @Retryable 保持一致,返回值也要一样,否则无法执行!

测试方法

运行结果:

可以看到这些配置跟我们直接写注解的方式是差不多的,这里就不过多的介绍了。。

RetryOperations 定义重试的API, RetryTemplate 是API的模板模式实现,实现了重试和熔断。提供的API如下:

下面主要介绍一下RetryTemplate配置的时候,需要设置的重试策略和退避策略

RetryPolicy是一个接口, 然后有很多具体的实现,我们先来看看它的接口中定义了什么方法

我们来看看他有什么具体的实现类

看一下退避策略,退避是指怎么去做下一次的重试,在这里其实就是等待多长时间。

listener可以监听重试,并执行对应的回调方法

使用如下:

自定义一个Listener

把listener设置到retryTemplate中

测试结果:

原文链接:Spring Retry 在SpringBoot 中的应用 - ityml - 博客园


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12528072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存