3

int:request-handler-advice-chainサービスアクティベーターと一緒に使用しています。正しく動作していますが、サービスアクティベーターによってスローされた例外に基づいて、異なる回数の再試行を許可するためorg.springframework.retry.policy.SimpleRetryPolicyに使用したいと考えています。org.springframework.retry.policy.ExceptionClassifierRetryPolicy

私が抱えている問題は、例外ExceptionClassifierRetryPolicy

org.springframework.integration.MessageHandlingException

MessageHandlingExceptionで利用可能になったものから原因(つまり、私の例外)を取得するための最良のアプローチについてアドバイスできますExceptionClassifierRetryPolicyか?

以下のArtemの提案による解決策:

MessagingException の場合に原因を返す SubclassClassifier のサブクラスを作成する

public class MessagingCauseExtractingSubclassClassifier extends SubclassClassifier<Throwable, RetryPolicy> {

    private static final Logger LOG = LoggerFactory.getLogger(MessagingCauseExtractingSubclassClassifier.class);

    public MessagingCauseExtractingSubclassClassifier(final Map<Class<? extends Throwable>, RetryPolicy> policyMap, final RetryPolicy retryPolicy) {
        super(policyMap, retryPolicy);
    }

    @Override
    public RetryPolicy classify(final Throwable throwable) {
        Throwable t = throwable;
        if (t instanceof MessagingException) {
            t = t.getCause();
            LOG.debug("Throwable is instanceof MessagingException so classifying cause type: {}", t.getClass());
        }
        return super.classify(t);
    }
}

次に、新しい分類子と policyMap を使用する新しい ExceptionClassifierRetryPolicy サブクラス

public class MessasgeCauseExtractingExceptionClassifierRetryPolicy extends ExceptionClassifierRetryPolicy {

    @Override
    public void setPolicyMap(final Map<Class<? extends Throwable>, RetryPolicy> policyMap) {
        final MessagingCauseExtractingSubclassClassifier classifier = new MessagingCauseExtractingSubclassClassifier(
                policyMap, new NeverRetryPolicy());
        setExceptionClassifier(classifier);
    }
}

現在、これは MessagingException での retying をサポートしていませんが、これは私たちのユース ケースでは問題ありません。それ以外の場合は完全に機能します。

4

1 に答える 1

0

適切な状態になるまで StackTrace 全体を分析するオプションがありBinaryExceptionClassifierます。traverseCauses

まさにこのオプションは、SimpleRetryPolicyコンストラクターの 1 つにあります。

public SimpleRetryPolicy(int maxAttempts, Map<Class<? extends Throwable>, Boolean> retryableExceptions,
        boolean traverseCauses) {

そのバリアントが実行可能かどうかを確認してください。

于 2015-08-11T14:54:24.567 に答える