重試的工具類
Guava-retrying
依賴
<!-- https://mvnrepository.com/artifact/com.github.rholder/guava-retrying --> <dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version> </dependency>
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder() //拋出runtime異常、checked異常時都會重試,但是拋出error不會重試。 .retryIfException() //返回false也需要重試(可以根據返回值確定需不需要重試) .retryIfResult(Predicates.equalTo(false)) //重調策略 .withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS)) //嘗試次數 .withStopStrategy(StopStrategies.stopAfterAttempt(3)) .build(); try { retryer.call(callable); } catch (RetryException | ExecutionException e) { // 重試失敗 后續操作 // ... e.printStackTrace(); }
RetryerBuilder
RetryerBuilder 是一個 factory 創建者,可以定制設置重試源且可以支持多個重試源,可以配置重試次數或重試超時時間,以及可以配置等待時間間隔,創建重試者 Retryer 實例。
RetryerBuilder 的重試源支持 Exception 異常對象和自定義斷言對象,通過retryIfException 和 retryIfResult 設置,同時支持多個且能兼容。
retryIfException
retryIfException,拋出 runtime 異常、checked 異常時都會重試,但是拋出 error 不會重試。
retryIfRuntimeException
retryIfRuntimeException 只會在拋 runtime 異常的時候才重試,checked 異常和error 都不重試。
retryIfExceptionOfType
retryIfExceptionOfType 允許我們只在發生特定異常的時候才重試,比如NullPointerException 和 IllegalStateException 都屬於 runtime 異常,也包括自定義的error。