2017-05-23 1 views
0

私は再試行シナリオで作業しています(http発信ゲートウェイに関連しています)。リトライロジックはうまくいきますが、再試行しないロジックにはバグがあります。Spring再試行:NeverRetryLogic ExceptionClassifierRetryPolicyで期待どおりに動作しません。

404,500,503,504と異なるhttpステータスエラーが発生した場合は、再試行しないでください。

これをテストするために、構成可能なエンドポイントがあります。これは、成功を得る前にX回の間、任意のhttpステータスエラーで応答するように構成できます。

例えば、私がヒットしたのはちょうど初めて400番のステータスになるようにエンドポイントを設定することができます。その後、再試行すると、正常な応答が得られます。

私が期待していたことは、初めてHTTP 400のステータスを取得するようにエンドポイントを設定した場合、再試行はしませんが、動作していないように見えます。

シナリオを再試行したことがないために、私が持っているロジックはこの1つである:CustomRetryPolicyはこれです

<int-http:outbound-gateway 
      header-mapper="httpHeaderMapper" 
      request-channel="some_request_channel" 
      url-expression="'http://some_url" 
      http-method="POST" 
      expected-response-type="java.lang.String" 
      charset="UTF-8" 
      reply-timeout="${com.property.value.from.db.for.time.out:5000}" 
      reply-channel="some_reply_channel"> 

      <int-http:request-handler-advice-chain> 
         <bean class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice"> 
          <property name="recoveryCallback"> 
           <bean class="org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer"> 
            <constructor-arg ref="errorChannel" /> 
           </bean> 
          </property> 
          <property name="retryTemplate" ref="retryTemplate" /> 
         </bean> 
      </int-http:request-handler-advice-chain> 

    </int-http:outbound-gateway> 


    <bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate"> 
     <property name="retryPolicy"> 
      <bean class="com.whatever.CustomRetryPolicy"> 
       <property name="maxAttempts" value="${com.property.value.from.db.for.retry.MaxAttemps:5}" /> 
      </bean> 
     </property> 
     <property name="backOffPolicy"> 
      <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy"> 
       <property name="initialInterval" value="${com.property.value.from.db.for.backoffpolicy.initialInterval:1000}" /> 
       <property name="multiplier" value="${com.property.value.from.db.for.backoffpolicy.initialInterval:6}" /> 
      </bean> 
     </property> 
    </bean> 

NeverRetryPolicyクラスによると

public class CustomRetryPolicy extends ExceptionClassifierRetryPolicy { 

    private String maxAttempts; 

    @PostConstruct 
    public void init() { 

     final RetryPolicy defaultRetry = defaultRetryPolicy(); 
     this.setExceptionClassifier(new Classifier<Throwable, RetryPolicy>() { 
      @Override 
      public RetryPolicy classify(Throwable classifiable) { 
       Throwable exceptionCause = classifiable.getCause(); 
       if (exceptionCause instanceof HttpStatusCodeException) { 
        int statusCode = ((HttpStatusCodeException) classifiable.getCause()).getStatusCode().value(); 
        handleHttpErrorCode(statusCode); 
       } 
       return defaultRetry; 
      } 
     }); 
    } 

    public void setMaxAttempts(String maxAttempts) { 
     this.maxAttempts = maxAttempts; 
    } 


    private RetryPolicy handleHttpErrorCode(int statusCode) { 
     RetryPolicy retryPolicy = null; 
     switch(statusCode) { 
     case 404 : 
     case 500 : 
     case 503 : 
     case 504 : 
      retryPolicy = defaultRetryPolicy(); 
      break; 
     default : 
      retryPolicy = neverRetry(); 
      break; 
     } 

     return retryPolicy; 
    } 

    private RetryPolicy neverRetry() { 
     return new NeverRetryPolicy(); 
    } 

    private RetryPolicy defaultRetryPolicy() { 
     final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(); 
     simpleRetryPolicy.setMaxAttempts(5); 
     return simpleRetryPolicy; 
    } 

} 

、それがこれを行う必要があります

最初の試行を許可しますが、再試行を許可しない試行ポリシーです。 また、他のポリシーの基本クラスとしても使用できます。テストのため をスタブとして使用します。

最初の試行は、エンドポイントに達したときにHTTP 400のエラーステータスを受け取った後、再試行しないことです。

どうしたのですか?

+0

どこから 'handleHttpErrorCode'を呼び出していますか?そして、あなたはその結果で何をしていますか?実行時にポリシーを選択するのは奇妙に見えますが、大きな画像が表示されないことがあります。質問を編集して、呼び出しコードと再試行テンプレートの設定を追加します。 –

+0

@GaryRussellの質問が更新されました。 – Columb1a

答えて

2

デフォルトポリシーは常に返されます。あなたがここにreturnを必要とするようにところで...

return handleHttpErrorCode(statusCode); 

に見える、かなり新しいものを毎回作成するよりも、一度ポリシーを作成する方が良いだろう。

+0

あなたはそうです! 、また、コードは 'defaultRetry'を最後に返すべきではありません。代わりに、その代わりに、 'neverRetry()'を返す必要があります。それで、再試行しないようにすることができます。もし 'HttpStatusCodeException'と違うものがあれば – Columb1a

関連する問題