深入Go底层原理,重写Redis中间件实战(完整无密 网盘分享)

#1

download:深入Go底层原理,重写Redis中间件实战(完整无密 网盘分享)

一个Java注解@Recover搞定丑陋的循环重试代码

运用背景

在理论项目中其中一部分逻辑可能会由于调用了外部效劳或者等候锁等情况下呈现不可预料的异常,在这个时分我们可能需求对调用这部分逻辑中止重试,代码里面主要就是运用for循环写一大坨重试的逻辑,各种硬编码,各种辣眼睛的补丁。

特别是针对重试的逻辑,四处都有。所以我决议用一个重试组件 spring-retry 优化一波。它的呈现,处置掉这部分丑陋的代码!

2开端上代码

首先引入依赖:

    org.springframework.retry
    spring-retry
    1.3.2
复制代码
复制代码

由于该组件是依赖于 AOP 给你的,所以还需求引入这个依赖(假设你其他 jar 包中援用过了,当然也就不需求再次援用了):

    org.springframework.boot
    spring-boot-starter-aop
    2.6.1
复制代码
复制代码

开启重试:

@SpringBootApplication
@EnableRetry
public class ApplicationStarter {
  public static void main(String[] args) {
  SpringApplication.run(ApplicationStarter.class);
  }
}
复制代码
复制代码

Controller层

@RestController
public class TestController {
@Autowired
private IRecursiveCallService recursiveCallService;
    @GetMapping("test2")
    public Object test2() {
        return recursiveCallService.testService();
    }
}
复制代码
复制代码

Service层

public interface IRecursiveCallService {
    /**
     * 测试service
     *
     * @return
     */
    List testService();
}
复制代码
复制代码

Service层细致完成

@Service
public class RecursiveCallServiceImpl implements IRecursiveCallService {
    @Override
    @Retryable(recover = "testService3")
    public List testService() {
        System.out.println("到此一游!");
        System.out.println(1 / 0);
        return null;
    }
    @Recover
    public List testService1() {
        System.out.println("错误的返回");
        return Collections.singletonList("S");
    }
    @Recover
    public List testService2(String i) {
        System.out.println("正确的返回");
        return Collections.singletonList(1);
    }
    @Recover
    public List testService3() {
        System.out.println("正确的返回2");
        return Collections.singletonList(2);
    }
}
```## 3@Retryable注解重要属性解析
-   `recover`: 此类中用于恢复的方法的称号。方法必需用 {@link Recover} 注释标志。
-   `value`: 可重试的异常类型。包括()的同义词。默许为空(假设 excludes 也为空,则重试一切异常)。
-   `exclude`: 不可重试的异常类型。默许为空(假设包含也为空,则重试一切异常)。假设 include 为空但 excludes 不是,则重试一切未扫除的异常
-   `maxAttempts`: 方法重试调用次数,默许3次
-   `backoff`: 指定用于重试此操作的其他属性
## 4@backoff注解
-   `value`:重试之间间隔时间
-   `delay`:重试之间的等候时间(以毫秒为单位)
-   `maxDelay`:重试之间的最大等候时间(以毫秒为单位)
-   `multiplier`:指定延迟的倍数
-   `delayExpression`:重试之间的等候时间表达式
-   `maxDelayExpression`:重试之间的最大等候时间表达式
-   `multiplierExpression`:指定延迟的倍数表达式
-   `random`:随机指定延迟时间
## 5@Recover注解
主要作用是标志方法为一个重试方法的补偿方法!!!
## 6留意事项
-   方法重试依赖于 spring 注入,所以调用的方法的类必需是被spring管理的,然后经过 @Autowired 或 @Resource 引入运用,不然不会生效
-   方法重试的前提是方法抛出了异常,在方法执行呈现了异常且没有被捕获的情况下重试
-   方法重试需求在方法上面加上注解 @Retryable
-   方法重试的补偿方法上面必需携带@Recover注解
-   @Recover方法需求和@Retryable方法在同一个类中才干生效@Recover方法(@Recover方法在父类中也可以生效)
-   运用@Retryable注解,假设类中没有被@Recover标示的方法,无论能否运用 recover 属性都抛出原有异常
-   运用@Retryable注解同时 recover 属性不是空,假设类中有@Recover标示的方法,但是标示的方法不是 recover 指定的方法,抛出ExhaustedRetryException异常
-   运用@Retryable注解同时 recover 属性不是空,同时方法有注解@Recover,但是补偿方法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常
-   运用@Retryable注解不运用 recover 属性,假设类中被@Recover标示的方法有和原方法返回值一样的,运用当前被@Recover标示的办