2017-08-01 100 views
2

我已經使用Spring聲明重試在我的項目像SpringBoot重試,剩下的重試

@Service 
class Service { 
    @Async @Retryable(maxAttempts=12, [email protected](delay=100, maxDelay=500)) 
    public service() { 
     // ... do something 
    } 
} 

現在,我有兩個問題。

  1. 它是精細使用具有異步重試,我沒有任何問題,只是 要肯定。

  2. 第二個要求是,如果該進程失敗我要記錄它日誌文件,包括剩餘的重試次數。因此,有一種方法來傳遞,或獲得剩餘的重試次數從在方法內?

回答

2

您應該使用@Recover註解來執行一個動作上的每個故障,並保持一個計數的對象內部的方法之外。確保沒有其他方法與此計數器交互。這是基本的前提:

@Service 
class Service { 


private int attemptsLeft=12; 

@Retryable(maxAttempts=12, [email protected](delay=100, maxDelay=500)) 
public service() { 
    // ... do something that throws a KnownException you create to catch later on. 
} 

@Recover 
public void connectionException(KnownException e) { 
      this.attemptsLeft = this.attemptsLeft-1; //decrease your failure counter 
      Logger.warn("Retry attempts left:{}",attemptsLeft); 
     } 
} 

如果你不想要一個成員變量跟蹤數,則可能需要溝的註釋和申報RetryTemplate以訪問的背景下,與getRetryCount()方法。

public String serviceWithRetry() { 
    RetryTemplate retryTemplate = new RetryTemplate(); 
    final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(12); 
    retryTemplate.setRetryPolicy(retryPolicy); 
    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); 
    backOffPolicy.setInterval(100L); 
    retryTemplate.setBackOffPolicy(backOffPolicy); 
    retryTemplate.execute(new RetryCallback<Void, RuntimeException>() 
     return retryTemplate.execute(new RetryCallback<Void, RuntimeException>() { 
     @Override 
     public void doWithRetry(RetryContext context) { 
      LOG.info("Retry of connection count: {}", context.getRetryCount()); 
      return //something with your connection logic 
     } 
    }); 
} 
+0

謝謝你非常喜歡這個方向。那來到我的腦海,但服務是沒有任何國家要保持一個非常併發對象。正如你在我的崗位都看到了,我也用@Async註釋,因此私人INT attemptsLeft = 12;這不可能是一種解決方法。我可以使用原子整數,但後來我還需要一種方法通過線程來區分瓦爾。其他選項將是線程本地,但我想知道爲什麼沒有更簡單的工作。或者在那裏? – Imran

+0

謝謝,好像是沒有辦法與註解周圍。 – Imran

1

周圍有使用說明沒辦法,@Recover標註的方法只有最後失敗重試後執行,每一個失敗後不。

Refer to this github documentation

從鏈接的摘錄上文「呼叫‘服務’的方法,如果失敗了的RemoteAccessException那麼它會重試(最多默認爲三次),然後執行‘復原’方法如果不成功。「

即使使用RetryTemplate重試回調所有重試都用盡後才能調用。

另一個摘錄形成相同的鏈路「當一個重試耗盡時RetryOperations可以通過控制不同的回調,則RecoveryCallback。要使用此功能,客戶只是通過在回調在一起,同樣的方法」

+0

非常感謝你的詳細解答,但恢復方法是從我的要求不夠好。只要康復在那裏,我就可以不計數。 – Imran