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) {