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 但这对我们的用例来说很好。否则效果很好。
BinaryExceptionClassifier
有 traverseCauses
选项来分析整个 StackTrace 直到合适的条件。
正是这个选项与 SimpleRetryPolicy
构造函数之一:
public SimpleRetryPolicy(int maxAttempts, Map<Class<? extends Throwable>, Boolean> retryableExceptions,
boolean traverseCauses) {
请查看该变体是否适合您。
我正在使用 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 但这对我们的用例来说很好。否则效果很好。
BinaryExceptionClassifier
有 traverseCauses
选项来分析整个 StackTrace 直到合适的条件。
正是这个选项与 SimpleRetryPolicy
构造函数之一:
public SimpleRetryPolicy(int maxAttempts, Map<Class<? extends Throwable>, Boolean> retryableExceptions,
boolean traverseCauses) {
请查看该变体是否适合您。