RetryTemplate に 300000 ミリ秒の遅延を持たせたい - 試行ごとに 5 分に 1.1 を掛けたもの。ただし、次の試行を 30 秒遅らせるだけです。簡単な例を次に示します。
@Service
public class Foo {
private static final Logger log = Logger.getLogger(Foo.class);
@Retryable(value = Exception.class,
backoff = @Backoff(delay = 300000, multiplier = 1.1))
public void run() throws Exception {
new Bar().run();
}
@Recover
void recover(Exception e) {
log.error("e", e);
}
}
public class Bar {
private static final Logger log = Logger.getLogger(Bar.class);
public void run() throws Exception{
log.info("hier");
throw new Exception();
}
}
@Bean
CommandLineRunner runner() {
return (String[] a) -> {
scheduler.schedule(() -> {
try {
retryTemplate.execute(arg -> {
foo.run();
return null;
});
} catch (Exception e) {
}
}, 1 , TimeUnit.SECONDS);
};
}
ログは次の時刻に作成されます。
2017-03-17 13:25:08.439 INFO 6500 --- [
2017-03-17 13:25:38.439 INFO 6500 --- [
2017-03-17 13:26:08.440 INFO 6500 --- [
2017-03-17 13:26:08.444 ERROR 6500 --- [
スケジューラーを使用しても使用しなくても違いはありません (元のコードでは初期遅延が必要なため、スケジューラーが存在します)。
maxDelay を@Backoff
@Backoff(delay = 300000, multiplier = 1.1, maxDelay = 1000000000)
意図したとおりに動作します - 5 分後に発火し、次に 5*1.1 分後に発火します。ただし、@Backoff - maxDelay の javadoc を読むと、デフォルトは 0 であり、遅延未満の場合は無視されると書かれています
/**
* The maximimum wait (in milliseconds) between retries. If less than the
* {@link #delay()} then ignored.
*
* @return the maximum delay between retries (default 0 = ignored)
*/
long maxDelay() default 0;
わからなかったことはありますか?maxDelay のデフォルトは 30 秒のようですが、これは javadoc の説明とはかなり異なります。
使用されたスプリングリトライのバージョンは 1.1.3 です