-1

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 です

4

1 に答える 1