我想仅在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>
答案 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;
}