2

Ich habe einen erholsamen Service einen externen Dienstleister mit Spring Wolke Feign ClientFeign Client und Spring Wiederholungs

@FeignClient(name = "external-service", configuration = FeignClientConfig.class) 
public interface ServiceClient { 

    @RequestMapping(value = "/test/payments", method = RequestMethod.POST) 
    public void addPayment(@Valid @RequestBody AddPaymentRequest addPaymentRequest); 

    @RequestMapping(value = "/test/payments/{paymentId}", method = RequestMethod.PUT) 
    public ChangePaymentStatusResponse updatePaymentStatus(@PathVariable("paymentId") String paymentId, 
      @Valid @RequestBody PaymentStatusUpdateRequest paymentStatusUpdateRequest); 

} 

Ich bemerkte den folgenden Ausfall 3-4 mal in den letzten 3 Monaten in meiner Log-Datei aufrufen:

json.ERROR_RESPONSE_BODY: Verbindung Ausführung verweigert POST http://external-service/external/payments json.message: Sende Zahlung hinzufügen Failure Zahlung Für anderen Grund: {ERROR_RESPONSE_BODY = Verbindung Ausführung verweigert POST http://external-service/external/payments, EVENT = ADD_PAYMENT_FAILURE, TRANSACTION_ID = XXXXXXX} { } json.EVENT: ADD_PAYMENT_FAILURE json.stack_trace: feign.RetryableException: Verbindung verweigert POST ausführt http://external-service/external/payments bei feign.FeignException.errorExecuting (FeignException.java:67) bei feign.SynchronousMethodHandler.executeAndDecode (SynchronousMethodHandler.java:104) bei feign.SynchronousMethodHandler.invoke (SynchronousMethodHandler.java:76) bei feign.ReflectiveFeign $ FeignInvocationHandler.invoke (ReflectiveFeign.java:103)

Ist es möglich, Spring Retry auf einem Feign-Client hinzuzufügen? Was ich den addPayment Betrieb mit

@Retryable(value = {feign.RetryableException.class }, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier=2)) 

Aber dies ist nicht möglich, was andere Möglichkeiten habe ich mit Anmerkungen versehen wollte?

Antwort

1

Sie können eine Retryer in der mit Config-Probe Retryer Beispiel auf der Retryer.Default basierend Aktualisiert FeignClientConfig

@Configuration 
public class FeignClientConfig { 

    @Bean 
    public Retryer retryer() { 
     return new Custom(); 
    } 

} 

class Custom implements Retryer { 

    private final int maxAttempts; 
    private final long backoff; 
    int attempt; 

    public Custom() { 
     this(2000, 3); 
    } 

    public Custom(long backoff, int maxAttempts) { 
     this.backoff = backoff; 
     this.maxAttempts = maxAttempts; 
     this.attempt = 1; 
    } 

    public void continueOrPropagate(RetryableException e) { 
     if (attempt++ >= maxAttempts) { 
      throw e; 
     } 

     try { 
      Thread.sleep(backoff); 
     } catch (InterruptedException ignored) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

    @Override 
    public Retryer clone() { 
     return new Custom(backoff, maxAttempts); 
    } 
} 

hinzufügen.

+0

Können Sie dem Codebeispiel benutzerdefinierte Retryer zeigt zeigen? Wie konfiguriere ich Wiederholung nur für feign.RetryableException und max Versuch = 3 und Backoff-Zeitraum 2 Sekunden zwischen Wiederholungen – Satya

+0

Sie können nur Ihre eigenen Retry – Jeff

0

Wenn Sie Band verwenden Sie Eigenschaften festlegen, können Sie unter Eigenschaften für Wiederholungs verwenden können:

myapp.ribbon.MaxAutoRetries=5 
myapp.ribbon.MaxAutoRetriesNextServer=5 
myapp.ribbon.OkToRetryOnAllOperations=true 

Hinweis: „myapp“ ist Ihr Service-ID.

Kasse diese Github implementation zum Beispiel Arbeits

+0

Nur müssen erneut versuchen für feign.RetryableException.class und nur für externe-Feign-Client. Meine Anwendung enthält mehrere Schein-Clients. Für Ribbon-Einstellungen können wir den spezifischen Feign-Client und die Exception-Klasse angeben. – Satya

+0

Für diesen speziellen Fall müssen Sie FeignConfig verwenden und an Ihre FeignClient-Klasse anhängen und die Logik ausführen – Yogi

Verwandte Themen