2017-08-29 271 views
3

是否可以配置@Retryable?此方法(getCurrentRate)将被调用3次。首先是5分钟,之后10分钟,最后15分钟。我该如何配置?如何在Spring-retry(Spring Boot)中配置延迟时间

@Retryable(maxAttempts=3,value=RuntimeException.class,backoff = @Backoff(delay = 1000)) 

public class RealExchangeRateCalculator implements ExchangeRateCalculator { 

    private static final double BASE_EXCHANGE_RATE = 1.09; 
    private int attempts = 0; 
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 

    @Retryable(maxAttempts=3,value=RuntimeException.class,backoff = @Backoff(delay = 1000)) 
    public Double getCurrentRate() { 

     System.out.println("Calculating - Attempt " + attempts + " at " + sdf.format(new Date())); 
     attempts++; 

     try { 
      HttpResponse<JsonNode> response = Unirest.get("http://rate-exchange.herokuapp.com/fetchRate") 
       .queryString("from", "EUR") 
       .queryString("to","USD") 
       .asJson(); 

      switch (response.getStatus()) { 
      case 200: 
       return response.getBody().getObject().getDouble("Rate"); 
      case 503: 
       throw new RuntimeException("Server Response: " + response.getStatus()); 
      default: 
       throw new IllegalStateException("Server not ready"); 
      } 
     } catch (UnirestException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Recover 
    public Double recover(RuntimeException e){ 
     System.out.println("Recovering - returning safe value"); 
     return BASE_EXCHANGE_RATE; 
    } 

} 
+1

延迟由退避注释,退避= @Backoff加入(延迟= 300000,乘法器= 2),该值是在毫秒, 没有明确的设置,默认值是1000ms的固定延迟 只有延迟()设置:退避是一个固定的延迟与该值 当设置delay()和maxDelay()时,退避均匀分布在这两个价值es 使用delay(),maxDelay()和multiplier(),退避指数增长到最大值 –

回答

3

可以实现与这种配置:

@Retryable(
    maxAttempts=3, 
    value=RuntimeException.class, 
    backoff = @Backoff(
    delay = 300000, 
    multiplier = 2, 
    maxDelay = 900000 
) 
) 

调用次数:

  1. 后5米〜Delay = 300000
  2. 后10米〜Delay = 300000 * 2 = 600000
  3. 15米后〜Delay = 600000 * 2 = 1200000 with Max Delay of 900000
+0

什么是最大延迟? –

+0

'maxDelay'是重试之间的最大等待时间,以毫秒为单位。你的情况应该是90000ms〜15m。使用'delay','maxDelay'和'multiplier',退避指数增长到最大值。 更多的信息在这里:https://docs.spring.io/spring-retry/docs/api/current/org/springframework/retry/annotation/Backoff.html#maxDelay() –

+0

它停止运行后第二个 –