6 Ocak 2020 Pazartesi

SpringRetry @Retryable Anotasyonu

Giriş
Ş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
@EnableRetry
public class Application {
...
}

@Service
class Service {
  @Retryable(RemoteAccessException.class)
  public void service() {
    // ... do something
  }
  @Recover
  public 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.
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.
backoff Alanı
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.
@Retryable(value = {SomeException1.class,SomeException2.class},
           maxAttempts = Constants.RETRY_VAL,
           backoff = @Backoff(value = 5000))
public String getData(){...}
maxAttempts Alanı
Şöyle yaparız
@Service
public class RatingServiceImpl implements RatingService {

  private String ratingServiceUrl = ...;

  @Autowired
  private 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);
  }

  @Recover
  public 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) )
value Alanı
retryFor Alanı ile aynıdır

Hiç yorum yok:

Yorum Gönder