Я использую int:request-handler-advice-chain
с моим активатором обслуживания. Он работает правильно с org.springframework.retry.policy.SimpleRetryPolicy
, однако я бы хотел использовать org.springframework.retry.policy.ExceptionClassifierRetryPolicy
, чтобы допускать другое количество повторений на основе исключения, вызванного активатором службы.Весенняя интеграция с повторением с ExceptionClassifierRetryPolicy
Проблема, которую я имею, что к тому времени, исключение попадает в ExceptionClassifierRetryPolicy
это
org.springframework.integration.MessageHandlingException
Может кто-нибудь посоветовать на лучший подход для получить причину (то есть мое исключение) от MessageHandlingException
, доступную для ExceptionClassifierRetryPolicy
?
Решение благодаря предложению Артема ниже:
Создать подкласс 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, но это нормально для нашего использования дело. В противном случае отлично работает.
Спасибо Artem, это, безусловно, в правильном направлении, единственная проблема заключается в том, что SimpleRetryPolicy не позволяет использовать разные maxAttempts на основе типа Exception. –
OK. Поэтому я предлагаю вам реализовать свой собственный ... 'SubclassClassifier', похожий на' BinaryExceptionClassifier', но возвращая правильную 'RertyPolicy' в хорошем состоянии для' причины' –