2015-08-11 2 views
3

Я использую 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, но это нормально для нашего использования дело. В противном случае отлично работает.

ответ

0

BinaryExceptionClassifier имеет traverseCauses вариант для анализа всего StackTrace до надлежащего состояния.

Именно этот вариант с одним из SimpleRetryPolicy конструктора:

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

Пожалуйста, посмотрите, если такой вариант осуществим для Вас.

+0

Спасибо Artem, это, безусловно, в правильном направлении, единственная проблема заключается в том, что SimpleRetryPolicy не позволяет использовать разные maxAttempts на основе типа Exception. –

+0

OK. Поэтому я предлагаю вам реализовать свой собственный ... 'SubclassClassifier', похожий на' BinaryExceptionClassifier', но возвращая правильную 'RertyPolicy' в хорошем состоянии для' причины' –

Смежные вопросы