2017-03-17 2 views
0

RetryTemplateの遅延を300000ミリ秒に設定します。ただし、次の試行は30秒だけ遅れます。ログはこれらの時間に行われmaxDelayが設定されていない場合、Spring retryTemplateが早すぎます。

@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 --- [ 

私はそれを使用する場合、それは違いはありません。ここでは単純化した例ですスケジューラの有無にかかわらず(元のコードには初期遅延が必要であるため)、

は今、私はそれが意図したとおりに動作します@Backoff

@Backoff(delay = 300000, multiplier = 1.1, maxDelay = 1000000000) 

にMAXDELAYを追加した場合 - 5 * 1.1分というようにした後、その後、5分後に発射します。しかし@BackoffのJavadocを読んで - MAXDELAY、それは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の説明とはかなり異なっています。コードhereを参照してください -

使用し、スプリングリトライ版はそれはのjavadocのバグだ1.1.3

答えて

1

です。

policy.setMaxInterval(max > min ? max : ExponentialBackOffPolicy.DEFAULT_MAX_INTERVAL); 

public static final long DEFAULT_MAX_INTERVAL = 30000L; 
+0

それをクリアしてその...ありがとう! – baao

関連する問題