实现接口重试
admin
2024-02-10 16:57:49
0次

文章目录

  • 引入依赖
  • 准备工作
    • 启动类 加注解@EnableRetry
    • 接口服务
    • @Retryable
    • @Backoff
    • @Recover
  • 测试类

引入依赖


org.projectlomboklombok

org.aspectjaspectjweaver1.9.6

org.springframework.retryspring-retry1.2.5.RELEASE

准备工作

启动类 加注解@EnableRetry

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;@SpringBootApplication
@EnableRetry
public class DemoApplication {public static void main(String[] args) {SpringApplication.run (DemoApplication.class, args);}}

接口服务

import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;import java.util.concurrent.atomic.LongAdder;@Component
@Slf4j
public class RetryServcie {private LongAdder num = new LongAdder ();/*** @return java.lang.String* @Desc 模拟服务调用异常* @Author xiaoding* @date 2022/11/23 17.51*/@Retryable(value = {RuntimeException.class}, maxAttemptsExpression = "${retry.maxAttempts:2}",backoff = @Backoff(delayExpression = "${retry.backoff:1000}"))public String hello() {num.increment ();long l = num.longValue ();if (l < 3L) {throw new RuntimeException ("出错了哟!");} else {num.reset ();return "接口调用成功";}}// 重试完成后 还是不成功的情况下,会执行被 @Recover修饰的方法。@Recoverpublic String recover(RuntimeException t) {log.info ("RetryServcie.recover:{}", t.getClass ().getName ());return "失败了";}
}

@Retryable

@Retryable 修饰在要重试的方法上,有以下参数:

  • interceptor:重试拦截器bean名称,用于可重试方法;
  • value:可重试的异常类型。含义同 include。默认为空(如果excludes也为空,则重试所有异常);
  • include:可重试的异常类型。默认为空(如果excludes也为空,则重试所有异常);
  • exclude:无需重试的异常类型。默认为空(如果includes也为空,则重试所有异常);
  • label:统计报告的唯一标签。如果未提供,则调用者可以选择忽略它或提供一个默认值;
  • stateful:若为true,标志重试是有状态的:即重新抛出异常,但是重试策略与相同的策略应用于具有相同参数的后续调用。若为false,则不会重新引发可重试的异常;
  • maxAttempts:最大重试次数(包括第一次失败),默认为3次;
  • maxAttemptsExpression:计算最大尝试次数(包括第一次失败)的表达式,默认为3 次;
  • backoff:重试等待策略;
  • exceptionExpression:指定在RetryServcie.canRetry()返回true之后要求值的表达式-可用于有条件地禁止重试。

@Backoff

@Backoff,重试等待策略。有以下参数:

  • value:倒退时期;
  • delay:重试之间的等待时间(以毫秒为单位);
  • maxDelay:重试之间的最大等待时间(以毫秒为单位);
  • multiplier:指定延迟的倍数;
  • delayExpression:重试之间的等待时间表达式;
  • maxDelayExpression:重试之间的最大等待时间表达式;
  • multiplierExpression:指定延迟的倍数表达式;
  • random:随机指定延迟时间。

@Recover

当重试耗尽时,用于@Retryable重试失败后处理方法,此方法里的异常一定要是 @Retryable方法里抛出的异常,否则不会调用这个方法。

@Retryable和@Recover修饰的方法要在同一个类中,且被@Recover 标记的方法的返回值必须与@Retryable方法一致,方法的第一个参数,必须是Throwable类型的,建议是与@Retryable 配置的异常一致,其他的参数,需要与 @Retryable 方法的参数一致。

由于@Retryable注解是通过切面实现的,因此要避免@Retryable 注解的方法的调用方和被调用方处于同一个类中,因为这样会使@Retryable 注解失效。

测试类

import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/retry")
@Slf4j
public class RetryController {@Autowiredprivate RetryServcie retryServcie;@GetMapping(value = "/test")public Result retry() {String hello;hello = retryServcie.hello ();return Result.ok ().setData (hello);}
}@Data
@Accessors(chain = true)
class Result {private int code;private String message;private Object data;public static Result ok() {return new Result ();}
}

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...