Spring Integration消息流中的条件重试建议?

时间:2017-09-19 22:42:24

标签: spring-integration

我有一个http网关电话,偶尔会返回503错误。我想围绕这个电话配置retry advice,但我不想为每个错误做这件事,只需要503s。

<int-http:outbound-gateway ... errorHandler="...">
    <int-http:request-handler-advice-chain>
        <int:retry-advice max-attempts="3" />
    </int-http:request-handler-advice-chain>
</int-http:outbound-gateway>

我已经配置了一个自定义错误处理程序来过滤我不想将其视为错误的状态(例如:404),但我没有看到一种明显的方法来控制建议的应用方式基于我在错误处理程序中可以做的事情。 This question处理相同的问题,但答案并未解释如何控制建议行为或在错误处理程序级别重新发出请求。是否有要抛出的特定异常类型?

编辑:基于答案的示例:

<bean id="spelParser" class="org.springframework.expression.spel.standard.SpelExpressionParser" />

<int-http:outbound-gateway ...>
    <int-http:request-handler-advice-chain>
        <bean class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">
            <property name="retryTemplate">
                <bean class="org.springframework.retry.support.RetryTemplate">
                    <property name="retryPolicy">
                        <bean class="org.springframework.retry.policy.ExpressionRetryPolicy">
                            <constructor-arg index="0" type="org.springframework.expression.Expression" value="#{spelParser.parseExpression('cause.statusCode.value() == 503')}" />
                            <property name="maxAttempts" value="3" />
                        </bean>
                    </property>
                    <property name="backOffPolicy">
                        <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
                            <property name="initialInterval" value="1000" />
                            <property name="multiplier" value="2" />
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    </int-http:request-handler-advice-chain>
</int-http:outbound-gateway>

1 个答案:

答案 0 :(得分:0)

好吧,对于你有HttpServerErrorException但希望通过statusCode与其他人区分并且不重试的情况,我建议你看一下:

 * Subclass of {@link SimpleRetryPolicy} that delegates to super.canRetry() and,
 * if true, further evaluates an expression against the last thrown exception.
 *
 * @author Gary Russell
 * @since 1.2
 *
 */
@SuppressWarnings("serial")
public class ExpressionRetryPolicy extends SimpleRetryPolicy implements BeanFactoryAware {

你的表达可以是:

expression="statusCode.value() == 503"

<强>更新

啊!我知道了。由于ExpressionRetryPolicy使用TemplateParserContext,您的表达式必须与#{statusCode.value() == 503}类似。但与此同时,它将在bean工厂初始化期间进行评估。我建议你做这样的事情:

<bean id="spelParser" class="org.springframework.expression.spel.standard.SpelExpressionParser"/>

并在ExpressionRetryPolicy bean定义中执行:

<constructor-arg index="0" type="org.springframework.expression.Expression" 
                 value="#{spelParser.parseExpression('statusCode.value() == 503')}" />

克服碰撞。