私は再試行シナリオで作業しています(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のエラーステータスを受け取った後、再試行しないことです。
どうしたのですか?
どこから 'handleHttpErrorCode'を呼び出していますか?そして、あなたはその結果で何をしていますか?実行時にポリシーを選択するのは奇妙に見えますが、大きな画像が表示されないことがあります。質問を編集して、呼び出しコードと再試行テンプレートの設定を追加します。 –
@GaryRussellの質問が更新されました。 – Columb1a