2014-12-01 9 views
7

È possibile impostare RetryPolicy in spring retry (https://github.com/spring-projects/spring-retry) in base al codice di stato errore? per esempio. Voglio riprovare su HttpServerErrorException con codice di stato HttpStatus.INTERNAL_SERVER_ERROR, che è 503. Pertanto dovrebbe ignorare tutti gli altri codici di errore - [500 - 502] e [504 - 511].È possibile impostare RetryPolicy in spring-retry in base al codice di stato HttpStatus?

+0

Non direttamente, ma se è possibile fornire un contesto molto più dettagliato di come si sta richiamando il server (ad esempio, se si utilizza un gateway in uscita Spring Integration o se si utilizza 'RestTemplate' direttamente dal codice), è possibile che essere in grado di suggerire una soluzione. –

+0

Ho esteso RestTemplate e ho eseguito l'override di alcuni metodi che lo circondano con RetryTemplate. Sto seguendo un esempio dato sul link github sopra, simile a ... policy SimpleRetryPolicy = new SimpleRetryPolicy(); policy.setMaxAttempts (5); policy.setRetryableExceptions (new Class [] {HttpServerErrorException.class}); Rapporti SpringTemplate 'HttpServerErrorException.class' per i codici di errore dello stato http 500 - 511 ma, voglio riprovare su 503 e 504. –

+0

Per ora, sto tirando gettato da RetryContext in doWithRetry (contesto RetryContext) e leggendo il messaggio di errore - context.getLastThrowable(). getMessage(), quindi cercando 503 o 504. Ci deve essere un modo migliore per farlo, credo. –

risposta

5

L'RestTemplate ha l'opzione setErrorHandler e DefaultResponseErrorHandler è quella predefinita.

Il suo codice assomiglia:

public void handleError(ClientHttpResponse response) throws IOException { 
    HttpStatus statusCode = getHttpStatusCode(response); 
    switch (statusCode.series()) { 
     case CLIENT_ERROR: 
      throw new HttpClientErrorException(statusCode, response.getStatusText(), 
        response.getHeaders(), getResponseBody(response), getCharset(response)); 
     case SERVER_ERROR: 
      throw new HttpServerErrorException(statusCode, response.getStatusText(), 
        response.getHeaders(), getResponseBody(response), getCharset(response)); 
     default: 
      throw new RestClientException("Unknown status code [" + statusCode + "]"); 
    } 
} 

Quindi, è in grado di fornire una propria implementazione per quel metodo per semplificare la RetryPolicy codici di stato in giro desiderati.

Problemi correlati