2

私は私のログファイルに次の障害に最後の3ヶ月で3〜4回に気づい春クラウド装うクライアント装うクライアントと春のリトライ

@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); 

} 

を使用して外部サービスを呼び出す安らかなサービスがあります。

json.ERROR_RESPONSE_BODY:支払いを送信 他の理由でお支払いの失敗を追加します:{ERROR_RESPONSE_BODY =接続 はPOSTの実行を拒否した接続がPOST http://external-service/external/payments json.messageを実行して拒否しました210、 EVENT = ADD_PAYMENT_FAILURE、TRANSACTION_ID = XXXXXXX} {} json.EVENT:ADD_PAYMENT_FAILURE json.stack_trace:feign.RetryableException:Connectionは でfeign.FeignException.errorExecuting(FeignException.java:67)でPOST http://external-service/external/paymentsを実行 を拒否feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104) でfeign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) でfeign.ReflectiveFeign $ FeignInvocationHandler.invoke(ReflectiveFeign.java:103)

Spring RetryをFeignクライアントに追加することは可能ですか? 私は

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

addPayment操作に注釈を付けるたかったが、これが不可能である何、私は他のどのような選択肢がありますか?

答えて

1

あなたはRetryer.Defaultに基づいて、試料Retryer例の設定で更新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); 
    } 
} 

Retryerを追加することができます。

+0

例を操作するため、このGithub implementationは、カスタムRetryerを示すコードサンプルを指すことはできますか?再試行の間にfeign.Retryableとmax attempt = 3とバックオフ期間の再試行を設定する方法 – Satya

+0

独自のリリースを実装することができます – Jeff

0

あなたがプロパティを設定することができますリボンを使用している場合は、再試行のためのプロパティの下に使用することができます。

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

注:「myappには」あなたのサービスIDです。

アウト

+0

feign.RetryException.classの再試行と外部サービスのフェイングクライアントのみが必要です。私のアプリケーションに複数のフェーンクライアントが含まれています。リボンの設定で特定のクライアントと例外クラスを指定できますか? – Satya

+0

このような場合には、FeignConfigを使用してFeignClientクラスにアタッチし、ロジックを実行する必要があります – Yogi

関連する問題