當(dāng)我們調(diào)用一個(gè)接口可能由于網(wǎng)絡(luò)等原因造成第一次失敗荠瘪,再去嘗試就成功了江场,這就是重試機(jī)制曹鸠,spring支持重試機(jī)制,并且在Spring Cloud中可以與Hystaix結(jié)合使用累奈,可以避免訪問到已經(jīng)不正常的實(shí)例贬派。
寫一個(gè)簡單的demo急但,加入依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
</dependencies>
在主類上加上@EnableRetry
注解,表示啟用重試機(jī)制搞乏。
@SpringBootApplication
@EnableRetry
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
定義一個(gè)簡單的controller層:
@RestController
public class HelloController {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PayService payService;
@GetMapping("/createOrder")
public String createOrder(@RequestParam int num) throws Exception{
int remainingnum = payService.minGoodsnum(num == 0 ? 1: num);
logger.info("剩余的數(shù)量==="+remainingnum);
return "庫庫存成功";
}
}
在controller中調(diào)用減庫存的service接口波桩,
@Service
public class PayService {
private Logger logger = LoggerFactory.getLogger(getClass());
private final int totalNum = 100000;
@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
public int minGoodsnum(int num) throws Exception{
logger.info("minGoodsnum開始"+ LocalTime.now());
if(num <= 0){
throw new Exception("數(shù)量不對");
}
logger.info("minGoodsnum執(zhí)行結(jié)束");
return totalNum - num;
}
}
在minGoodsnum方法上加上@Retryable
注解,value
值表示當(dāng)哪些異常的時(shí)候觸發(fā)重試请敦,maxAttempts
表示最大重試次數(shù)默認(rèn)為3镐躲,delay
表示重試的延遲時(shí)間,multiplier
表示上一次延時(shí)時(shí)間是這一次的倍數(shù)侍筛。
測試:
重試三次拋出異常萤皂。
使用@Recover
注解,當(dāng)重試次數(shù)達(dá)到設(shè)置的次數(shù)的時(shí)候匣椰,還是失敗拋出異常裆熙,執(zhí)行的回調(diào)函數(shù)。
關(guān)于@Recover
注解
和minGoodsnum定義在一個(gè)類中
@Recover
public int recover(Exception e){
logger.warn("減庫存失斍菪ΑH肼肌!蒲每!");
//記日志到數(shù)據(jù)庫
return totalNum;
}
重試測試一下纷跛,
感覺意義不大,重試失敗的時(shí)候應(yīng)該還是要拋出異常的邀杏,在上層進(jìn)行catch記錄日志贫奠,當(dāng)然也有特殊的場景適用。