Arşivler

Spring Cloud @Retryable Anotasyonu Nedir Kullanım Örneği

Spring Cloud Retryable Kullanim Örneği
Spring Cloud Retryable Kullanim Ö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=trueCode 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.


Önceki Ders: Spring Boot AWS SQS Kullanımı
Spring Cloud Dersleri
Sonraki Ders: Spring Cloud Bus ile Runtime Konfigürasyon Yönetimi