Giriş
Şu satırı dahil ederiz
Şu satırı dahil ederiz
import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Recover; import org.springframework.retry.annotation.Retryable;
Kullanım
Genellikle @Service olarak işaretli sınıflarda kullanılır. Metodun başına eklenir. Aynı @Transaction anotasyonunda olduğu gibi public metodun dışarıdan bir başka bean içinden çağrılması gerekir. Açıklaması şöyle
Retryable Method should be public and calls to that method should be from external class (not even child class) for Retry to work.
Önemli Alanlar
Açıklaması şöyle
@Retryable offers many parameters to customize the retry behavior, and the following three are the most important:- maxAttempts : number of attempts before failing- backoff : time to wait before a new attempt- value : exception types that are re-tryable
Varsayılan Ayarlar
Eğer tüm @Retryable anotasyonları için ayar atamak istersek şöyle yaparız
spring.retry.backoff.initial-interval=2000 spring.retry.backoff.max-interval=20000 spring.retry.backoff.multiplier=2 spring.retry.max-attempts=5
Örnek - varsayılan ayarlar
Şöyle yaparız. Burada @Recover ile @Retryable başarısız olursa ne yapılacağı belirtiliyor.
@Configuration@EnableRetrypublic class Application {...}@Serviceclass Service {@Retryable(RemoteAccessException.class)public void service() {// ... do something}@Recoverpublic void recover(RemoteAccessException e) {// ... panic}}
Açıklaması şöyle. Eğer service() metodu 3 kere exception fırlatırsa, @Recover ile işaretli metod çağrılır.
backoff AlanıThis example calls the service method and, if it fails with a RemoteAccessException, retries (by default, up to three times), and then tries the recover method if unsuccessful. There are various options in the @Retryable annotation attributes for including and excluding exception types, limiting the number of retries, and setting the policy for backoff.
Her retry işlemi arasında beklenecek süreyi milisaniye cinsinden belirtir. @Backoff anotasyonu milisaniye cinsinden değer verilerek kullanılır
Örnek
Şöyle yaparız.
Şöyle yaparız.
@Retryable(value = {SomeException1.class,SomeException2.class},
maxAttempts = Constants.RETRY_VAL,
backoff = @Backoff(value = 5000))
public String getData(){...}
maxAttempts AlanıŞöyle yaparız
@Servicepublic class RatingServiceImpl implements RatingService {private String ratingServiceUrl = ...;@Autowiredprivate RestTemplate restTemplate;@Override@Retryable(value = {SocketTimeoutException.class},maxAttempts = 2,backoff = @Backoff(delay = 1000))public ProductRatingDTO getRatings(int productId) {String url = this.ratingServiceUrl + "/" + productId;return this.restTemplate.getForObject(url, ProductRatingDTO.class);}@Recoverpublic ProductRatingDTO getRecoveryRatings() {return new ProductRatingDTO();}}
maxAttemptsExpression Alanı
Örnek
application.properties şöyle olsun
retry.maxAttempts=2
Şöyle yaparız
@Retryable( retryFor = {SQLException.class}, maxAttemptsExpression = ${retry.maxAttemps} )
retryFor Alanı
Hangi tipte hata olursa, tekrar deneneceğini belirtir.
Örnek
Şöyle yaparız
@Retryable( retryFor = {HttpClientErrorException.class, HttpTimeoutException.class},maxAttempts = 5, backoff = @Backoff(delay = 1000) )
retryFor Alanı ile aynıdır
Hiç yorum yok:
Yorum Gönder