根据抛出的异常,是否可以为一个服务激活器使用2个不同的重试bean?

时间:2016-07-19 18:57:23

标签: java spring spring-integration spring-retry

我想仅在ConnectionException的情况下对service-activator进行严重的重试,对于其他异常我不想使用重试或非常轻的重试。我可以使用什么配置?我的配置的本质如下:

<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 个答案:

答案 0 :(得分: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;
}