Spring与ExceptionClassifierRetryPolicy

时间:2015-08-11 14:28:19

标签: spring-integration spring-retry

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

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

  

org.springframework.integration.MessageHandlingException

任何人都可以通过MessageHandlingException提供ExceptionClassifierRetryPolicy的最佳方法(即我的例外)提供建议吗?

感谢Artem的建议如下:

创建SubclassClassifier的子类,在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);
    }
}

然后是一个新的ExceptionClassifierRetryPolicy子类,它使用新的分类器和policyMap

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进行重新配置,但这对我们的用例来说很好。否则效果很好。

1 个答案:

答案 0 :(得分:0)

BinaryExceptionClassifiertraverseCauses选项可以分析整个StackTrace,直到正常状态。

这个选项恰好是SimpleRetryPolicy构造函数之一:

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

请查看该变体是否可行。

相关问题