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