2016-07-19 7 views
1

Я бы хотел сделать серьезную попытку для активатора службы только в случае исключения ConnectionException, для других исключений я бы не хотел использовать повтор или очень легкую повторную попытку. Какую конфигурацию я могу использовать? Суть моей конфигурации приведена ниже:Возможно ли использовать 2 разных компонента повторной загрузки для одного активатора службы в зависимости от того, что выбрано исключение?

<int:channel id="sDZCreationErrorChannel"> 
    <int:interceptors> 
     <int:wire-tap channel="errorLogger"/> 
    </int:interceptors> 
</int:channel> 

<int:channel id="sDZConnectionErrorChannel"> 
    <int:interceptors> 
     <int:wire-tap channel="errorLogger"/> 
    </int:interceptors> 
</int:channel> 

<int:chain input-channel="sDZCreationErrorChannel" output-channel="outboundMailChannel"> 
    <int-mail:header-enricher> 
     <int-mail:to value="${integration.sdz.email.to}"/> 
     <int-mail:subject value="${integration.sdz.email.subject.creation}"/> 
    </int-mail:header-enricher> 
    <int:transformer ref="integrationEmailTransformer" method="transformToEmail"/> 
</int:chain> 

<int:chain input-channel="sDZConnectionErrorChannel" output-channel="outboundMailChannel"> 
    <int-mail:header-enricher> 
     <int-mail:to value="${integration.sdz.email.to}"/> 
     <int-mail:subject value="${integration.sdz.email.subject.noconnection}"/> 
    </int-mail:header-enricher> 
    <int:transformer ref="integrationEmailTransformer" method="transformToEmail"/> 
</int:chain> 

<int:channel id="sDZCreationChannel"> 
    <int:queue/> 
</int:channel> 

<!-- Processing Creation Chain --> 
<int:chain input-channel="sDZCreationChannel" output-channel="debugLogger" 
    auto-startup="#{environment.getProperty('sd.zoo.enabled') == 'connect'}"> 
    <int:poller fixed-delay="500" /> 
    <int:filter ref="sDZIntegrationExistingRequestSentFilter" method="filter"/> 
    <int:transformer ref="sDZCreationTransformer" method="transformOrder"/> 
    <int:service-activator ref="sDZCreationServiceImpl" method="activateConfirmationCodes"> 
     <int:request-handler-advice-chain> 
      <ref bean="retryAdvice"/> 
     </int:request-handler-advice-chain> 
    </int:service-activator> 
</int:chain> 

<int:exception-type-router input-channel="errorChannel" default-output-channel="integrationDeadLetterErrorChannel"> 
    <int:mapping exception-type="com.smartdestinations.connect.integration.exception.sdz.SDZCreationResponseException" channel="sDZCreationErrorChannel"/> 
    <int:mapping exception-type="com.smartdestinations.connect.integration.exception.sdz.SDZConnectionException" channel="sDZConnectionErrorChannel"/> 
</int:exception-type-router> 

ответ

1

Нет, вы не можете использовать один совет повторения вместе с другим. Стратегия <request-handler-advice-chain> заключается в том, чтобы обернуть один совет другому, указав, как они настроены в пределах <request-handler-advice-chain>. Итак, если вы объявите один retryAdvice, а затем другой, первый не будет достигнут, пока второй не завершит свою работу.

Я не вижу всю картину еще, как легко достичь ваших требований, но я действительно уверен, что вы должны иметь дело с обычаем RetryPolicy, где вы можете достичь цели с помощью исключения:

public boolean canRetry(RetryContext context) { 
    Throwable t = context.getLastThrowable(); 
    ... 
} 

обратить внимание к этому полезному RetryContext объект.

Существует также заинтересованный крюк как абстракция RetryListener, с помощью которой вы можете установить дополнительные атрибуты в это RetryContext. Например, в SI RequestHandlerRetryAdvice:

public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) { 
    context.setAttribute("message", messageHolder.get()); 
    return true; 
} 
+0

Вы имеете в виду ExceptionClassifierRetryPolicy? Если да, мне нужно перезаписать его с помощью собственного класса или я могу настроить его в XML? –

+0

1. Вы должны реализовать свою собственную «RetryPolicy». Да 'ExceptionClassifierRetryPolicy' может быть как образец для вас. 2. Вы можете настроить его в XML после этого как регулярный '' и ввести его в компонент' RetryTemplate'. –