Spring Cloud @Retryable Anotasyonu Nedir Kullanım Örneği
Spring Cloud Dersleri‘ne devam ediyorum.
Bu yazıda @Retryable anotasyonu kullanarak servislerimizde oluşabilecek hatalar sonucunda tekrar servise erişimi yönetebilmekteyiz.
@Retryable Anotasonu Nedir?
@Retryable anotasyonu Spring kütüphanesinde olan bir anotasyondur. Metodunun bir hata oluştuğunda tekrar çalışmasını sağlamaktayız.
Metodun üzerine yazacağımız attribute’ler sayesinde başarısızlıkla sonuçlanan metodun kaç kez deneneceğini, bekleme süresini ve sonucunda oluşacak hata tipini belirleyebilmekteyiz.
@Retryable Parametreleri
- value: Metodumuzun Exception sınıfının türünü tanımlarız.
- maxAttempts: Metodun kaç kere tekrarlandığını belirtiriz.
- backoff: Yeniden deneme süresini belirleriz.
application.properties Tanımlaması
Bu anotasyonun yazılımımızda çalışabilmesi için aşağıdaki tanımlamayı yapmamız gerekmektedir.
spring.retry.enabled=true
Code language: JavaScript (javascript)
Bu sayede yazılımız içerisindeki tüm retry fonksiyonlarının çalışmasını sağlamaktayız.
Servislerimizdeki metotların hepsine tek tek tekrar sayısı ve süresini belirleyebildiğimiz gibi application.properties dosyasına yazacağımız tanımlamala sayesinde tüm retry fonksiyonlarında genel bir kural seti verip, tüm servisimizdeki metotlarda geçerli kılabiliriz.
spring.retry.backoff.initial-interval=2000
spring.retry.backoff.max-interval=20000
spring.retry.backoff.multiplier=2
spring.retry.max-attempts=5
Yukarıdaki yaptığımız tanımlama sayesinde örnek olarak servisimize bir kural koymuş oluyoruz.
Örnek olarak yeniden deneme işleminin ilk bekleme süresini 2 saniye, maksimum bekleme süresini 20 saniye yeniden deneme işleminde bekleme süresinin 2 katına çıkacağı, yeniden deneme işleminin maksimum 3 kere yapılacağını da belirtmiş olduk.
@Retryable Kullanı Örneği
Servisimizde bir metot oluşturağız ve bu metodun içerisinde bir hata oluşturacağız. Bu hata sonucunda koyacağımız retry
sayesinde tekrar denenmesine ve beklemesine imkan tanıyacağız.
@Service
public class StudentService {
@Retryable(value = { RemoteServiceNotAvailableException.class }, maxAttempts = 5, backoff = @Backoff(delay = 5000))
public void updateStudent() {
// bir hata oluşmasını sağlayalım.
throw new RemoteServiceNotAvailableException();
}
}
Code language: Java (java)
Metodumuzda bir hata oluşturduk. Artık bu metoda gelen istekler sonucu oluşan hatada tekrar deneme ve süresi tanımlayarak beklemesini ve tekrar denenmesini sağlıyoruz.
Başka bir metot üzerinden çağırdığımıza RemoteServiceNotAvailableException
hatasını belirli bir süre ve denemeden sonra alacağız bu sayede oluşan hatayı handle edebiliriz.
Rest api oluşturalım.
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/call-remote-service")
public void callRemoteService() {
try {
studentService.updateStudent();
} catch (RemoteServiceNotAvailableException ex) {
// oluşan hatayı
}
}
}
Code language: PHP (php)
Feign Client tarafından başka bir servis tarafından erişilebilir.
@FeignClient(name = "student-service")
public interface RemoteStudentServiceClient {
@GetMapping("/update")
void updateStudent();
}
Code language: Java (java)
@Service
public class AnotherService {
@Autowired
private RemoteStudentServiceClient remoteStudentServiceClient;
public void updateStudent() {
try {
remoteStudentServiceClient.updateStudent();
} catch (RemoteServiceNotAvailableException ex) {
// hatayı handle edebiliriz.
}
}
}
Code language: Java (java)
Sonraki Spring Cloud Dersleri’nde görüşmek üzere.
No Comment! Be the first one.