- Controllerのハンドラメソッドのリトライと、Serviceのメソッドのリトライ
・ 例えば、あるメソッドでExceptionが発生した場合でも、そのメソッドを何度かリトライすることで正常終了になる可能性がある場合に用いる。
@RestController
public class RetryController {
@GetMapping
@Retryable(value = RetryException.class, maxAttempts = 5, backoff = @Backoff(delay = 500))
public String retryMethod() {
return "Hello!";
}
@Recover
public String recover(RetryException exception) {
return "Retry Exception!";
}
- Serviceの方は、インタフェースに@Retryableと@Recoverが付与されていることに注意。
・ Serviceの実装クラスに@Recoverを付与した場合は、何故かうまく動作しない。
- @Retryable
・ クラス(インタフェース)のメソッドに付与する。
・ @Retryable(value = リトライ対象のエクセプションクラス, maxAttempts = リトライ回数, backoff = @Backoff(delay = リトライの間隔))
・ valueには、value = {エクセプションクラス, ...}で複数のリトライ対象のエクセプションクラスが記述可能です。 - @Recover
・ @Retryableと同じクラス(インタフェース)のメソッドに付与する。
・ リトライ回数を越えて、リトライ対象のエクセプションクラスが発生した場合の処理を記述。
- Advances REST clientを使って動作確認すると便利です。
- Retry回数は5回です。
- localhost:8080/で初期化(retryのためのカウンタをクリア)
- localhost:8080/nでn回Exceptionを発行し、Retryします。
- n<5だと"Hello!"が、n>=6だと"Retry Exception!"が戻ります。
お仕事のご用命は以下までご連絡ください
info@starlight-storm.com