Guava-RetryingはGoogle Guavaライブラリを拡張し、任意のJavaメソッドに対してカスタマイズ可能なリトライロジックを提供します。特にネットワークや外部サービスの不安定な動作に対処するための強力なツールです。
Guava-Retryingとは?
外部APIやデータベース操作などでは、一時的な障害により呼び出しが失敗することがあります。Guava-Retryingを使用すると以下が可能です:
- 戻り値や例外に基づいてリトライ判定
- リトライ回数、待機時間、停止条件の設定
- 指数関数的バックオフ、フィボナッチバックオフなどの戦略選択
主要クラスは`Retryer`、`RetryerBuilder`、`Attempt`、`WaitStrategy`、`StopStrategy`で構成されます。
Maven/Gradleでの導入方法
Maven:
<dependency> <groupId>com.github.rholder</groupId> <artifactId>guava-retrying</artifactId> <version>2.0.0</version> </dependency>
Gradle:
implementation 'com.github.rholder:guava-retrying:2.0.0'
ソースコードビルド:
git clone https://gitcode.com/gh_mirrors/gu/guava-retrying cd guava-retrying ./gradlew build ./gradlew install
基本使用例:最初のリトライ器作成
以下は、メソッドがnullを返すかIOExceptionを投げる場合に最大3回リトライするサンプルです。
Callable<String> task = () -> {
return "Success"; // 実際の業務ロジック
};
Retryer<String> retry = RetryerBuilder.<String>newBuilder()
.retryIfResult(Objects::isNull)
.retryIfExceptionOfType(IOException.class)
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.build();
try {
retry.call(task);
} catch (RetryException e) {
System.out.println("リトライ回数が上限に達しました");
} catch (ExecutionException e) {
System.out.println("実行中にエラーが発生しました");
}
高度な戦略:3つのリトライパターン
1. 指数バックオフ:
Retryer<String> expRetry = RetryerBuilder.<String>newBuilder()
.retryIfExceptionOfType(IOException.class)
.withWaitStrategy(WaitStrategies.exponentialWait(100, 5, TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
2. フィボナッチバックオフ:
Retryer<String> fibRetry = RetryerBuilder.<String>newBuilder()
.retryIfExceptionOfType(IOException.class)
.withWaitStrategy(WaitStrategies.fibonacciWait(100, 2, TimeUnit.MINUTES))
.withStopStrategy(StopStrategies.neverStop())
.build();
3. 固定待機時間:
Retryer<String> fixedRetry = RetryerBuilder.<String>newBuilder()
.retryIfException()
.withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
.withStopStrategy(StopStrategies.stopAfterAttempt(5))
.build();
実践のヒント:5つの推奨事項
- ビジネス要件に基づき適切なリトライ回数を設定
- 状況に応じた待機戦略の選択
- 特定の例外のみリトライ対象にする
- `RetryListener`でリトライログを記録
- 単一試行のタイムアウト設定