Spring integration Spring与retry with ExceptionClassifierRetryPolicy的集成

Spring integration Spring与retry with ExceptionClassifierRetryPolicy的集成,spring-integration,spring-retry,Spring Integration,Spring Retry,我正在将int:request-handler-advice-chain与我的服务激活器一起使用。它与org.springframework.retry.policy.SimpleRetryPolicy一起正常工作,但是我想使用org.springframework.retry.policy.ExceptionClassifierRetryPolicy来允许基于服务激活器引发的异常进行不同次数的重试 我遇到的问题是,当异常到达异常ClassifierRetryPolicy时,它是一个 org.s

我正在将
int:request-handler-advice-chain
与我的服务激活器一起使用。它与
org.springframework.retry.policy.SimpleRetryPolicy
一起正常工作,但是我想使用
org.springframework.retry.policy.ExceptionClassifierRetryPolicy
来允许基于服务激活器引发的异常进行不同次数的重试

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

org.springframework.integration.MessageHandlingException

是否有人可以建议从
异常ClassifierRetryPolicy
提供的
消息HandlingException
获取原因(即我的异常)的最佳方法

由于Artem的建议,解决方案如下:

创建SubassClassifier的子类,在MessaginException情况下返回原因

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);
    }
}
公共类MessagingCauseeExtractingSubassClassifier扩展了SubassClassifier{
私有静态最终记录器LOG=LoggerFactory.getLogger(MessagingCauseeExtractingSubassClassifier.class);

public Messaging CauseeExtracting SubassClassifier(最终映射)BinaryExceptionClassifier
具有
traverseCauses
选项来分析整个堆栈跟踪,直到达到适当的条件

此选项正好与
SimpleRetryPolicy
构造函数之一配合使用:

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

公共简单政策(int MaxAttems,Map感谢Artem,这肯定是正确的方向唯一的问题是SimpleRetryPolicy不允许基于异常类型的不同MaxAttems。好的。因此,我建议您实现自己的…
子分类器
类似于
BinaryExceptionClassifier
,但返回正确的
RertyPolicy
原因的状况良好
public SimpleRetryPolicy(int maxAttempts, Map<Class<? extends Throwable>, Boolean> retryableExceptions,
        boolean traverseCauses) {