2021-07-22

Spring框架中一个有用的小组件:Spring Retry

1、概述

Spring Retry 是Spring框架中的一个组件,
它提供了自动重新调用失败操作的能力。这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助。

在本文中,我们将看到使用Spring Retry的各种方式:注解、RetryTemplate以及回调。

2、Maven依赖

让我们首先将spring-retry依赖项添加到我们的pom.文件中:

<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.5.RELEASE</version></dependency>

我们还需要将Spring AOP添加到我们的项目中:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.8.RELEASE</version></dependency>

可以查看Maven Central来获取最新版本的spring-retry
spring-aspects 依赖项。

3、开启Spring Retry

要在应用程序中启用Spring Retry,我们需要将@EnableRetry注释添加到我们的@Configuration类:

@Configuration@EnableRetrypublic class AppConfig { ... }

4、使用Spring Retry

4.1、@Retryable而不用恢复

我们可以使用@Retryable注解为方法添加重试功能:

@Servicepublic interface MyService { @Retryable(value = RuntimeException.class) void retryService(String sql);}

在这里,当抛出RuntimeException时尝试重试。

根据@Retryable的默认行为,重试最多可能发生3次,重试之间有1秒的延迟。

4.2、@Retryable@Recover

现在让我们使用@Recover注解添加一个恢复方法:

@Servicepublic interface MyService { @Retryable(value = SQLException.class) void retryServiceWithRecovery(String sql) throws SQLException;   @Recover void recover(SQLException e, String sql);}

这里,当抛出SQLException时重试会尝试运行。 当@Retryable方法因指定异常而失败时,@Recover注解定义了一个单独的恢复方法。

因此,如果retryServiceWithRecovery方法在三次尝试之后还是抛出了SQLException,那么recover()方法将被调用。

恢复处理程序的第一个参数应该是Throwable类型(可选)和相同的返回类型。其余的参数按相同顺序从失败方法的参数列表中填充。

4.3、自定义@Retryable的行为

为了自定义重试的行为,我们可以使用参数maxAttemptsbackoff

@Servicepublic interface MyService { @Retryable( value = SQLException.class,  maxAttempts = 2, backoff = @Backoff(delay = 100)) void retryServiceWithCustomization(String sql) throws SQLException;}

这样最多将有两次尝试和100毫秒的延迟。

4.4、使用Spring Properties

我们还可以在@Retryable注解中使用properties。

为了演示这一点,我们将看到如何将delaymaxAttempts的值外部化到一个properties文件中。

首先,让我们在名为retryConfig.properties的文件中定义属性:

retry.maxAttempts=2retry.maxDelay=100

然后我们指示@Configuration类加载这个文件:

@PropertySource("classpath:retryConfig.properties")public class AppConfig { ... }// ...

最后,我们可以在@Retryable的定义中注入retry.maxAttemptsretry.maxDelay的值:

@Service public interface MyService { @Retryable( value = SQLException.class, maxAttemptsExpression = "${retry.maxAttempts}",   backoff = @Backoff(delayExpression = "${retry.maxDelay}")) void retryServiceWithExternalizedConfiguration(String sql) throws SQLException; }

请注意,我们现在使用的是maxAttemptsExpressiondelayExpression而不是maxAttemptsdelay

5、RetryTemplate

5.1、RetryOperations

Spring Retry提供了RetryOperations接口,它提供了一组execute()方法:

public interface RetryOperations { <T> T execute(RetryCallback<T> retryCallback) throws Exception; ...}

execute()方法的参数RetryCallback,是一个接口,可以插入需要在失败时重试的业务逻辑:

public interface RetryCallback<T> { T doWithRetry(RetryContext context) throws Throwable;}

5.2、RetryTemplate配置

RetryTemplateRetryOperations的一个实现。

让我们在@Configuration类中配置一个RetryTemplate的bean:

@Configurationpublic class AppConfig { //... @Bean public RetryTemplate retryTemplate() {  RetryTemplate retryTemplate = new RetryTemplate();		  FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();  fixedBackOffPolicy.setBackOffPeriod(2000l);  retryTemplate.setBackOffPolicy(fixedBackOffPolicy);  SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();  retryPolicy.setMaxAttempts(2);  retryTemplate.setRetryPolicy(retryPolicy);		  return retryTemplate; }}

这个RetryPolicy确定了何时应该重试操作。

其中SimpleRetryPolicy定义了重试的固定次数,另一方面,BackOffPolicy用于控制重试尝试之间的回退。

最后,FixedBackOffPolicy会使重试在继续之前暂停一段固定的时间。

5.3、使用RetryTemplate

要使用重试处理来运行代码,我们可以调用retryTemplate.execute()方法:

retryTemplate.execute(new RetryCallback<Void, RuntimeException>() { @Override public Void doWithRetry(RetryContext arg0) {  myService.templateRetryService();  ... }});

我们可以使用lambda表达式代替匿名类:

retryTemplate.execute(arg0 -> { myService.templateRetryService(); return null;});

6、监听器

监听器在重试时提供另外的回调。我们可以用这些来关注跨不同重试的各个横切点。

6.1、添加回调

回调在RetryListener接口中提供:

public class DefaultListenerSupport extends RetryListenerSupport { @Override public <T, E extends Throwable> void close(RetryContext context,  RetryCallback<T, E> callback, Throwable throwable) {  logger.info("onClose");  ...  super.close(context, callback, throwable); } @Override public <T, E extends Throwable> void onError(RetryContext context,  RetryCallback<T, E> callback, Throwable throwable) {  logger.info("onError");   ...  super.onError(context, callback, throwable); } @Override public <T, E extends Throwable> boolean open(RetryContext context,  RetryCallback<T, E> callback) {  logger.info("onO......

原文转载:http://www.shaoqun.com/a/892011.html

跨境电商:https://www.ikjzd.com/

cima:https://www.ikjzd.com/w/1372

zozotown:https://www.ikjzd.com/w/2180

3suisses:https://www.ikjzd.com/w/412


1、概述SpringRetry是Spring框架中的一个组件,它提供了自动重新调用失败操作的能力。这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助。在本文中,我们将看到使用SpringRetry的各种方式:注解、RetryTemplate以及回调。2、Maven依赖让我们首先将spring-retry依赖项添加到我们的pom.文件中:<dependency><group
环球b2b:https://www.ikjzd.com/w/1762
livingsocial:https://www.ikjzd.com/w/714.html
体验普吉岛奇妙的租妻文化 :http://www.30bags.com/a/414105.html
体验世界上最疯狂的14条道路(图):http://www.30bags.com/a/429006.html
体验蔚蓝生活享受烂漫普吉 :http://www.30bags.com/a/409102.html
体验西班牙 | 探索巴塞罗那的各个区域:http://www.30bags.com/a/242972.html
男友开车到没人的地方要我 随着车的摇晃滑进去:http://lady.shaoqun.com/a/247396.html
他把舌头伸进两腿之间 舌尖逗弄她颤抖的小核:http://lady.shaoqun.com/m/a/248221.html
2021深圳文博会在会展中心吗:http://www.30bags.com/a/516277.html
深圳红色主题公园一览表:http://www.30bags.com/a/516292.html
深圳华侨城体育中心游泳馆在哪里:http://www.30bags.com/a/516293.html
eBay捐赠100万元驰援河南防汛救灾:https://www.ikjzd.com/articles/146810

No comments:

Post a Comment