Spring 与 ExceptionClassifierRetryPolicy 的重试集成

Spring integration with retry with ExceptionClassifierRetryPolicy

我正在使用 int:request-handler-advice-chain 和我的服务激活器。它与 org.springframework.retry.policy.SimpleRetryPolicy 一起正常工作,但我想使用 org.springframework.retry.policy.ExceptionClassifierRetryPolicy 以允许根据服务激活器抛出的异常进行不同次数的重试。

我遇到的问题是,当异常到达 ExceptionClassifierRetryPolicy 时,它是一个

org.springframework.integration.MessageHandlingException

任何人都可以建议从 ExceptionClassifierRetryPolicy 可用的 MessageHandlingException 中找出原因(即我的例外)的最佳方法吗?

解决方案感谢 Artem 的以下建议:

创建 SubclassClassifier 的子类,returns MessagingException

的原因
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 但这对我们的用例来说很好。否则效果很好。

BinaryExceptionClassifiertraverseCauses 选项来分析整个 StackTrace 直到合适的条件。

正是这个选项与 SimpleRetryPolicy 构造函数之一:

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

请查看该变体是否适合您。