2017-09-19 1 views
2

J'ai un appel de passerelle HTTP qui renvoie parfois 503 erreurs. Je voudrais configurer retry advice autour de cet appel, mais je ne veux pas le faire pour chaque erreur, seulement les 503s.Conseil de nouvelle tentative conditionnelle dans un flux de messages Spring Integration?

<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> 

J'ai déjà un gestionnaire d'erreur personnalisé configuré que les statuts filtres (ex: 404) que je ne veux pas traiter comme des erreurs, mais je ne vois pas un moyen évident de contrôler la façon dont le conseil est appliqué en fonction de ce que je peux faire dans le gestionnaire d'erreurs. This question traite du même problème, mais la réponse n'explique pas comment contrôler le comportement du conseil ou réémettre la requête au niveau du gestionnaire d'erreurs. Existe-t-il un type d'exception spécifique à lancer?

modifier: Exemple fonction de la réponse:

<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> 

Répondre

0

Eh bien, pour le cas où vous avez un HttpServerErrorException, mais souhaitez distinguer par le statusCode des autres et ne pas de nouvelles tentatives, je vous suggère de prendre un regard sur le:

* 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 { 

Si votre expression peut être comme:

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

MISE À JOUR

Ah! Je vois. Depuis ExpressionRetryPolicy utilise TemplateParserContext votre expression doit certainement être comme #{statusCode.value() == 503}. Mais en même temps, il va être évalué lors de l'initialisation de l'usine de haricots. Je vous suggère de faire quelque chose comme ceci:

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

et dans la définition de haricots ExpressionRetryPolicy faire:

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

Pour remédier à la collision.

+0

Pour personnaliser la politique, vous fournissez les conseils en tant que '' ('RequestHandlerRetryAdvice'), l'injection d'une coutume' RetryTemplate' avec la stratégie personnalisée. –

+0

Je pense que je vois comment câbler ExpressionRetryPolicy. (J'ai dû séparer cette dépendance séparément parce que l'intégration de printemps: 4.3.12.RELEASE saisit seulement spring-retry: 1.1.x au lieu de la nouvelle version 1.2 où cette classe a été introduite.) Cependant, je reçois une erreur à démarrage car il ne peut pas résoudre l'expression. ('EL1008E: La propriété ou le champ' $ statusCode 'est introuvable sur l'objet de type' org.springframework.beans.factory.config.BeanExpressionContext '- peut-être pas public? ') Le SPEL que j'ai essayé est' expression = "# {$ statusCode.value() == 503} "'. –

+0

??? Ce n'est pas Spel. Vous devez spécifier 'expression d'exécution'. Et je vous ai déjà dit comment: 'expression =" statusCode.value() == 503 "'. Ce que vous essayez de faire s'appelle 'expression d'initialisation d'usine de haricot', mais vraiment pas d'exécution. De toute façon, le symbole '$' est faux aussi ... –