12 Ocak 2021 Salı

SpringRetry Kullanımı

Giriş
SpringRetry kütüphanesinin anotasyonları taraması için

1. @EnableRetry anotasyonunu tanımlamak gerekir veya
2. spring.retry.enabled=true tanımını yapmak gerekir.

Maven
Şu satırı dahil ederiz
<dependency>
  <groupId>org.springframework.retry</groupId>
  <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
  <version>2.3.1.RELEASE</version>
</dependency>
SpringRetry'ı kullanmak için iki tane yöntem var 
1. Metodun üzerine @Retryable koymak. Bu kolay olan yöntem. @Retryable başarısız olursa @Recover ile belirtilen metod çalıştırılır 
2. RetryTemplate sınıfını kod içinde kullanmak. Bu zor olan yöntem

Örnek
Şöyle yaparız. Burada RestTemplate kullanırken exception alınırsa, tekrar deneniyor.
@EnableRetry
@Configuration
public class CommonConfig {
  @Bean
  public RestTemplate restTemplate() {
   return new RestTemplate();
  }
}

@Slf4j
@Service
public class ExternalService {
  static final String URL = "http://localhost:8081/target/readiness";

  @Autowired
  private RestTemplate restTemplate;

  @Retryable(retryFor = Exception.class, 
             maxAttempts = 10, 
             backoff = @Backoff(delay = 1000))
  public String checkWithRetry() {
    HttpEntity<?> entity = new HttpEntity<Object>(null, null);
    ResponseEntity<String> response = restTemplate.exchange(URL, HttpMethod.GET, 
      entity, String.class);
    return response.getBody();
  }
}
Aynı şeyi kodla yapsaydık şöyle olurdu
public String checkWithRetry() {
  long timeToWait = 1000;
  int numRetry = 1;
  int maxAttempts = 10;
  boolean isDataReady = false;
  String result = null;
  do {
   try {
    HttpEntity<?> entity = new HttpEntity<Object>(null, null);
    ResponseEntity<String> response = restTemplate.exchange(URL, HttpMethod.GET, 
      entity, String.class);
    result = response.getBody();
    isDataReady = true;
   } catch (Exception e) {
    try {
     Thread.sleep(timeToWait);
    } catch (InterruptedException exception) {
      ...
    }
    numRetry++;
   }
  } while (!isDataReady && numRetry <= maxAttempts);
  return result;
 }





Hiç yorum yok:

Yorum Gönder