精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 遠程調用失?。咳绾蝺炑诺倪M行重試?

開發 前端
今天給大家介紹了一下 Spring 的 @Retryable 注解使用,并通過幾個 demo 來帶大家編寫了自己重試攔截器以及回滾方法的時候,是不是感覺用起來會很爽,那還在等什么趕緊用起來吧,其中還有很多細節,只有自己真正的使用過才能體會到。

在日常開發的過程中我們經常會需要調用第三方組件或者數據庫,有的時候可能會因為網絡抖動或者下游服務抖動,導致我們某次查詢失敗。

這種時候我們往往就會進行重試,當重試幾次后依舊還是失敗的話才會向上拋出異常進行失敗。接下來阿粉就給大家演示一下通常是如何做的,以及如何更優雅的進行重試。

常規做法

我們先來看一下常規做法,常規做法首先會設置一個重試次數,然后通過 while 循環的方式進行遍歷,當循環次數沒有達到重試次數的時候,直到有正確結果后就返回,如果重試依舊失敗則會進行睡眠一段時間,再次重試,直到正常返回或者達到重試次數返回。

package com.example.demo.service;

import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
public class HelloService {
public String sayHello(String name) {
String result = "";
int retryTime = 3;
while (retryTime > 0) {
try {
//
result = name + doSomething();
return result;
} catch (Exception e) {
System.out.println("send message failed. try again in 1's");
retryTime--;
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}
}
return result;
}

private int doSomething() {
Random random = new Random();
int i = random.nextInt(3);
System.out.println("i is " + i);
return 10 / i;
}
}

這里為了模擬異常的情況,阿粉在 doSomething? 函數里面進行了隨機數的生成和使用,當隨機出來的值為 0 的時候,則會觸發 java.lang.ArithmeticException 異常,因為 0 不能作除數。

接下來我們再對外提供一個接口用于訪問,代碼如下

package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@Autowired
private HelloService helloService;

@GetMapping(value = "/hello")
public String hello(@RequestParam("name") String name) {
return helloService.sayHello(name);
}
}

正常啟動過后,我們通過瀏覽器進行訪問。

圖片

可以看到,我們第一次方法的時候就成功的達到了我們要的效果,隨機數就是 0 ,在 1 秒后重試后結果正常。在多試了幾次過后,會遇到三次都是 0 的情況,這個時候才會拋出異常,說明服務是真的有問題了。

圖片

圖片

圖片

上面的代碼可以看到是有效果了,雖然不是很好看,特別是在還有一些其他邏輯的情況,看上去會很臃腫,但是確實是可以正常使用的,那么有的小伙伴就要問了,有沒有一種優雅的方式呢?總不能在很多地方都重復的這樣寫重試的代碼吧。

注解重試

要知道我們普通人在日常開發的時候,如果遇到一個問題肯定是別人都遇到過的,什么時候當我們遇到的問題,沒有人遇到過的時候,那說明我們是很前衛的。

因此小伙伴能想到的是不是有簡單的方式來進行重試,有的人已經幫我們想好了,可以通過 @Retryable 注解來實現一樣的效果,接下來阿粉就給大家演示一下如何使用這個注解。

首先我們需要在啟動類上面加入 @EnableRetry? 注解,表示要開啟重試的功能,這個很好理解,就像我們要開啟定時功能需要添加 @EnableScheduling? 注解一樣,Spring? 的 @Enablexxx 注解也是很有意思的,后面我們再聊。

添加完注解以后,需要加入切面的依賴,如下

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>

如下不加入這個切面依賴,啟動的時候會有如下異常

圖片

添加的注解和依賴過后,我們需要改造 HelloService? 里面的 sayHello()? 方法,簡化成如下,增加  @Retryable 注解,以及設置相應的參數值。

@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2))
public String sayHello(String name){
return name + doSomething();
}

再次通過瀏覽器訪問 http://127.0.0.1:8080/hello?name=ziyou 我們看到效果如下,跟我們自己寫的重試一樣。

圖片

@Retryable 詳解

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.retry.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retryable {
String recover() default "";

String interceptor() default "";

Class<? extends Throwable>[] value() default {};

Class<? extends Throwable>[] include() default {};

Class<? extends Throwable>[] exclude() default {};

String label() default "";

boolean stateful() default false;

int maxAttempts() default 3;

String maxAttemptsExpression() default "";

Backoff backoff() default @Backoff;

String exceptionExpression() default "";

String[] listeners() default {};
}

點到這個注解里面,我們可以看到這個注解的代碼如下,其中有幾個參數我們來解釋一下

  • recover:  當前類中的回滾方法名稱;
  • interceptor: 重試的攔截器名稱,重試的時候可以配置一個攔截器;
  • value:需要重試的異常類型,跟下面的 include 一致;
  • include:包含的重試的異常類型;
  • exclude:不包含的重試異常類型;
  • label:用于統計的唯一標識;
  • stateful?:標志表示重試是有狀態的,也就是說,異常被重新拋出,重試策略是否會以相同的策略應用于具有相同參數的后續調用。如果是false,那么可重試的異常就不會被重新拋出。
  • maxAttempts:重試次數;
  • backoff:指定用于重試此操作的屬性;
  • listeners?:重試監聽器bean 名稱;

配合上面的一些屬性的使用,我們就可以達到通過注解簡單來實現方法調用異常后的自動重試,非常好用。我們可以在執行重試方法的時候設置自定義的重試攔截器,如下所示,自定義重試攔截器需要實現 MethodInterceptor? 接口并實現 invoke 方法,不過要注意,如果使用了攔截器的話,那么方法上的參數就會被覆蓋。

package com.example.demo.pid;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.retry.interceptor.RetryInterceptorBuilder;
import org.springframework.retry.interceptor.RetryOperationsInterceptor;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.stereotype.Component;

@Component
public class CustomRetryInterceptor implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
RetryOperationsInterceptor build = RetryInterceptorBuilder.stateless()
.maxAttempts(2).backOffOptions(3000, 2, 1000).build();
return build.invoke(invocation);
}
}

自定義回滾方法,我們還可以在重試幾次依舊錯誤的情況,編寫自定義的回滾方法。

  @Retryable(value = Exception.class,
recover = "recover", maxAttempts = 2,
backoff = @Backoff(delay = 1000, multiplier = 2))
public String sayHello(String name){
return name + doSomething();
}

@Recover
public String recover(Exception e, String name) {
System.out.println("recover");
return "recover";
}

圖片

要注意:

  • 重試方法必須要使用@Recover 注解;
  • 返回值必須和被重試的函數返回值一致;
  • 參數中除了第一個是觸發的異常外,后面的參數需要和被重試函數的參數列表一致;

上面代碼中的 @Backoff(delay = 1000, multiplier = 2) 表示第一次延遲 1000ms 重試,后面每次重試的延遲時間都翻倍。

總結

阿粉今天給大家介紹了一下 Spring? 的 @Retryable 注解使用,并通過幾個 demo 來帶大家編寫了自己重試攔截器以及回滾方法的時候,是不是感覺用起來會很爽,那還在等什么趕緊用起來吧,其中還有很多細節,只有自己真正的使用過才能體會到。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-10-27 08:20:12

springboot微服務

2019-01-21 09:28:32

版本命令程序員

2020-08-29 19:28:08

版本回退命令代碼

2025-07-09 07:20:00

GORMGo分頁

2024-05-29 09:20:41

2024-12-06 09:27:28

2022-09-07 09:19:49

Docker健康檢查

2023-10-10 13:23:18

空指針異常Java

2023-02-28 08:17:31

Go遠程配置apollo

2012-04-11 11:10:25

JavaRMI

2025-05-28 01:15:00

Golang重試機制

2010-02-22 10:06:17

Python調用

2020-12-11 11:26:47

Spring批處理重試

2010-01-05 13:47:43

Jquery Json

2022-05-10 10:09:12

KubernetesPod網絡抓包

2022-09-15 15:31:50

AndroidHTTPS抓包

2022-11-29 07:53:50

2010-07-22 13:38:49

SQL Server

2012-02-07 13:21:37

Java

2021-06-10 09:05:43

Linux命令大文件切割
點贊
收藏

51CTO技術棧公眾號

日本精品在线| 国产亚洲欧美精品久久久www| 成人小电影网站| 国产拍欧美日韩视频二区| 国产精品久久久久久av福利| 亚洲一区电影在线观看| 在线播放一区二区精品视频| 欧美日韩国产在线看| 午夜精品视频在线观看一区二区| 国产精品永久久久久久久久久| 欧美特黄一级| 亚洲人成网站在线播| av亚洲天堂网| 成年女人在线看片| 国产精品国产精品国产专区不片 | 国产精品第56页| 精品盗摄女厕tp美女嘘嘘| 欧美一级片在线观看| 18禁男女爽爽爽午夜网站免费 | 国产精品午夜在线观看| 岛国视频一区免费观看| 亚洲精品国产欧美在线观看| 韩国自拍一区| 日韩在线观看网址| 日本丰满少妇裸体自慰| 国产激情精品一区二区三区| 欧美日韩一区二区三区| 日本老太婆做爰视频| 欧美日韩在线精品一区二区三区激情综| 久久丁香综合五月国产三级网站| 亚州成人av在线| 182在线观看视频| 亚洲人成网www| 精品91自产拍在线观看一区| 亚洲77777| 日韩影片中文字幕| 精品国产91久久久久久| 麻豆传媒网站在线观看| 999国产在线视频| 久久一二三国产| 亚洲自拍偷拍色片视频| 在线观看中文字幕码| 久久精品三级| 欧美一级片一区| 欧美人禽zoz0强交| 91久久国产| 伊人伊成久久人综合网小说 | 日韩精品丝袜美腿| 日韩精品在线看片z| 亚洲欧美日韩三级| 成人性片免费| 欧美日韩精品一区二区| 97公开免费视频| 亚洲三级欧美| 色综合婷婷久久| av天堂永久资源网| 亚洲黄色免费看| 日韩欧美在线网址| 国产在线观看福利| 黄色综合网址| 91精品办公室少妇高潮对白| 国产男女无遮挡| 二区三区不卡| 在线观看亚洲专区| 国产91色在线观看| 97精品资源在线观看| 6080国产精品一区二区| 成人免费黄色av| 日本成人精品| 亚洲第一偷拍网| 亚洲最大的黄色网| 亚洲人成网站77777在线观看| 亚洲免费精彩视频| 日本猛少妇色xxxxx免费网站| 精品72久久久久中文字幕| 亚洲天堂视频在线观看| 久久久免费看片| 中文字幕乱码亚洲无线精品一区 | 亚洲精品在线视频观看| 91在线免费看| 亚洲激情av在线| 欧美日韩精品在线一区二区| 欧美xoxoxo| 欧美日韩亚洲丝袜制服| 欧美人与性动交α欧美精品| 红杏aⅴ成人免费视频| 日韩av在线精品| 夜夜春很很躁夜夜躁| 国产精品久久久乱弄| 欧美激情中文字幕在线| 在线观看免费av片| 精品一区二区免费看| 99re在线观看| 成人精品一区二区三区免费| 亚洲乱码日产精品bd| 国产素人在线观看| 成人看片网页| 日韩一区二区三区视频在线| 中文字幕无码人妻少妇免费| 日韩情爱电影在线观看| 久久久久久香蕉网| 亚洲婷婷久久综合| 国产成人精品一区二区三区四区| 你懂的网址一区二区三区| 久久综合网导航| 黑人巨大精品欧美一区二区一视频 | 国产成人免费观看| 成人欧美亚洲| 天天操天天干天天综合网| 色www免费视频| 欧美美女在线直播| 色偷偷888欧美精品久久久| 伊人久久综合视频| 国产精品 日产精品 欧美精品| 欧美亚洲另类在线一区二区三区| 中文字幕在线播放网址| 欧美色图第一页| 亚洲一区二区三区四区五区六区 | 日韩一区二区三区国产| 天堂网av手机版| 国产成人小视频| 制服国产精品| 成人av色网站| 亚洲欧美另类人妖| 国产成人在线免费观看视频| 国产不卡视频一区| 天堂v在线视频| 成人看片在线观看| 亚洲小视频在线观看| 日韩精品一区三区| 国产.欧美.日韩| 日韩精品福利片午夜免费观看| 欧美与亚洲与日本直播| 国产视频综合在线| 国产情侣在线视频| 成人午夜又粗又硬又大| 国产一级片91| 日韩激情综合| 色综合男人天堂| av中文字幕在线免费观看| 日本一二三四高清不卡| eeuss中文| 国产精品一区二区免费福利视频| 日韩电影大全免费观看2023年上 | 偷拍一区二区| 午夜精品久久久久久久99热浪潮 | 国产毛片久久| 国产乱码精品一区二区三区日韩精品| 午夜毛片在线| 日本韩国精品在线| 国产精品扒开腿做爽爽| 中文在线不卡| 国产精品一区二区欧美黑人喷潮水 | 亚洲精品一区二区三区精华液| 国产wwwwxxxx| 视频在线观看一区二区三区| 91社区国产高清| 在线免费观看的av| 欧美一区二区视频网站| 美国一级片在线观看| 免费一区二区视频| 午夜欧美一区二区三区免费观看| 日韩伦理在线一区| 亚洲第一免费播放区| 国产午夜激情视频| 北条麻妃一区二区三区| 乱熟女高潮一区二区在线| 欧美成人精品午夜一区二区| 久久久久久久久久久免费| 午夜精品久久久久久久99| 亚洲人精品午夜| 天天久久综合网| 亚洲一区二区三区无吗| 亚洲一区二区三区四区在线播放 | 久久av中文字幕| 国产偷人妻精品一区二区在线| 亚洲欧洲一区二区三区| 男人的天堂最新网址| 仙踪林久久久久久久999| 91成人在线看| 国产在线88av| 亚洲色图50p| 中文字幕久久熟女蜜桃| 亚洲欧洲日韩在线| 亚洲少妇一区二区| 99riav1国产精品视频| 你懂的网址一区二区三区| 19禁羞羞电影院在线观看| 亚洲剧情一区二区| 最近中文字幕在线观看视频| 中国av一区二区三区| 一级黄色片在线免费观看| 欧美三级第一页| 欧美h视频在线| 亚洲欧洲二区| 国内自拍欧美激情| 人人干在线视频| 日韩美一区二区三区| 日韩黄色在线视频| 国产日韩欧美精品综合| 亚洲一区二区在线视频观看| 欧美私人啪啪vps| 亚洲一区二区精品在线| 亚洲性视频在线| 欧美在线观看网址综合| 免费黄网在线观看| 欧美xxxx在线观看| 中文字幕视频一区二区| 一卡二卡三卡日韩欧美| 51调教丨国产调教视频| 另类小说视频一区二区| 一区二区视频在线观看| 夜色77av精品影院| www.成人av.com| 日韩不卡在线| 欧美黑人一区二区三区| 你懂的免费在线观看| 精品国产青草久久久久福利| 天堂网一区二区| 亚洲一区日韩精品中文字幕| 亚洲无人区码一码二码三码的含义| 久久黄色级2电影| 动漫av免费观看| 国内自拍视频一区二区三区 | 51自拍视频在线观看| 亚洲欧美日本日韩| 中国女人做爰视频| 精品国产精品国产偷麻豆| 国产精品美女诱惑| 天天综合网天天| 久久久久国产视频| 国产秀色在线www免费观看| 日韩精品免费视频| 天天干免费视频| 欧美一级一区二区| 亚洲中文一区二区三区| 欧美日韩一区二区精品| 精品无码免费视频| 亚洲欧洲av另类| 国产午夜精品久久久久久久久| 26uuu亚洲综合色| 成人一区二区三区仙踪林| 国产寡妇亲子伦一区二区| 久久99爱视频| 日本不卡123| 可以在线看的黄色网址| 亚洲成av人片一区二区密柚| 致1999电视剧免费观看策驰影院| 美女毛片一区二区三区四区最新中文字幕亚洲| 91久久国产自产拍夜夜嗨| 色综合一区二区日本韩国亚洲| 国产精品99久久久久久白浆小说| 老司机深夜福利在线观看| 欧美交受高潮1| 色黄网站在线观看| 久久91超碰青草是什么| 蜜桃传媒在线观看免费进入| 欧美床上激情在线观看| 成人欧美在线| 久久国产精品久久久久久| av中文天堂在线| 久久激情视频免费观看| 18免费在线视频| 色视频www在线播放国产成人| 色av男人的天堂免费在线| 亚洲精品国产精品自产a区红杏吧| 后入内射欧美99二区视频| 亚洲黄色www网站| 免费在线观看污视频| 日韩精品极品视频| 免费人成在线观看网站| 亚洲欧美中文字幕在线一区| 久久电影中文字幕| www.亚洲一区| 中文在线观看免费| 久久久久久久久久国产精品| 2020日本在线视频中文字幕| 青草青草久热精品视频在线网站 | 永久免费看mv网站入口亚洲| 日本免费中文字幕在线| 超在线视频97| av影院在线免费观看| 欧美有码在线观看视频| 999精品视频在线观看| 亚洲一区亚洲二区亚洲三区| 亚洲超碰在线观看| 精品国产一区二区三区免费| 欧美大胆视频| 天堂社区 天堂综合网 天堂资源最新版 | 在线观看日韩国产| 亚洲天堂男人网| 亚洲精品wwwww| 3d成人动漫在线| 欧美精品久久久久久久| 欧美家庭影院| 国产精品旅馆在线| 亚洲视频国产| 欧美12av| 天天超碰亚洲| 熟妇人妻va精品中文字幕| 精品一区二区免费在线观看| 亚洲av成人精品一区二区三区| 91亚洲国产成人精品一区二三| 国内毛片毛片毛片毛片毛片| 亚洲综合免费观看高清完整版在线| 在线观看国产亚洲| 欧美女孩性生活视频| 日韩av免费观影| 久久精品一本久久99精品| 9765激情中文在线| 国产精品亚洲综合天堂夜夜| 亚洲v天堂v手机在线| 中文字幕欧美日韩一区二区三区| 亚洲第一区色| 青青草久久伊人| av一区二区不卡| 卡通动漫亚洲综合| 狠狠躁夜夜躁人人爽天天天天97| 91丨porny丨在线中文 | 性生活免费网站| 亚洲欧美激情在线视频| 91福利在线尤物| 国产深夜精品福利| 亚洲福利天堂| 无码熟妇人妻av在线电影| 蜜桃视频一区二区三区| 三级电影在线看| 亚洲一区二区影院| 99re热视频| 亚洲激情视频在线| a视频在线免费看| 国产精品免费电影| av永久不卡| 黄色国产精品视频| 成人久久18免费网站麻豆| 国产精品天天干| 欧美主播一区二区三区| 天堂成人在线| 久久久人成影片一区二区三区观看 | 精品一区二区三区欧美| 无码一区二区三区在线| 色婷婷久久久综合中文字幕 | 中文不卡1区2区3区| 国内精品久久国产| 欧美午夜一区| 国产毛片久久久久久| 国产精品卡一卡二| 91好色先生tv| 色香阁99久久精品久久久| 亚洲最大网站| 国产日韩精品推荐| 亚洲深爱激情| 一女三黑人理论片在线| 精品福利在线视频| 亚洲AV无码精品色毛片浪潮| 麻豆国产精品va在线观看不卡| 亚洲精品成a人ⅴ香蕉片| 图片区小说区区亚洲五月| 蜜臀久久久99精品久久久久久| 国产高清一区二区三区四区| 色综合色综合色综合 | av在线一区二区| 久草视频在线资源站| 亚洲成人三级在线| av手机在线观看| 久久久久久久久久码影片| 日韩av一区二区在线影视| av永久免费观看| 欧美日韩亚洲高清一区二区| 精品视频一二三| 成人国内精品久久久久一区| 亚洲欧美色图| 少妇献身老头系列| 欧美午夜激情视频| 激情小视频在线观看| 国产精品久久9| 日韩一区电影| 手机在线播放av| 亚洲女人****多毛耸耸8| www.综合色| 91国内在线视频| 九九热线有精品视频99| 日本不卡一区二区在线观看| 亚洲欧美另类小说| 免费av网站在线播放| 国产成人精品免费视频| 日韩一区二区在线| 天堂av.com| 狠狠躁夜夜躁久久躁别揉| 91视频在线观看| www.久久爱.cn| 日韩电影一区二区三区四区| fc2ppv在线播放| 亚洲缚视频在线观看| 精品国产欧美日韩一区二区三区| 91免费视频黄| 91视频一区二区三区| 波多野结衣一本一道| 欧美高清视频在线播放| 亚洲性视频大全|