2014-12-01 16 views
7

RetryPolicy ürününü hata durumuna göre yeniden deneme (https://github.com/spring-projects/spring-retry) olarak ayarlamak mümkün müdür? Örneğin. HttpStatus.INTERNAL_SERVER_ERROR durum kodu ile HttpServerErrorException üzerinde yeniden denemek istiyorum, bu 503'tür. Bu nedenle, diğer hata kodlarını - [500 - 502] ve [504 - 511] dikkate almamalı.HttpStatus durum koduna göre yeniden deneme için RetryPolicy ayarlanabiliyor mu?

+0

Doğrudan değil, ancak sunucuyu nasıl çağırdığınıza dair daha fazla bağlam sağlayabiliyorsanız (örneğin, Spring Integration giden bir ağ geçidi kullanıyorsanız veya "RestTemplate" özelliğini doğrudan kodunuzdan kullanıp kullanmadığınızı) Bir çözüm önerebilir. –

+0

RestTemplate'i genişlettim ve RetryTemplate ile çevreleyen birkaç yöntemi geçersiz kıldım. Yukarıdaki gibi github bağlantısında verilen bir örneği takip ediyorum. SimpleRetryPolicy policy = new SimpleRetryPolicy(); policy.setMaxAttempts (5); policy.setRetryableExceptions (yeni Sınıf [] {HttpServerErrorException.class}); Spring restTemplate 'HttpServerErrorException.class' raporlarını http - 511 durum hatası kodları için bildiriyor ancak 503 ve 504'te yeniden denemek istiyorum. –

+0

Şimdilik, doWithRetry (RetryContext bağlamında) içinde RetryContext'ten atılabilir ve hata mesajını okuyorum. context.getLastThrowable(). getMessage(), daha sonra 503 veya 504'ü arıyorum. Bunu yapmak için daha iyi bir yol olmalı, bence. –

cevap

5

RestTemplate, setErrorHandler seçeneğine ve DefaultResponseErrorHandler varsayılan seçeneğidir. Bu yöntem RetryPolicy etrafında istenen durum kodlarını basitleştirmek için

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 + "]"); 
    } 
} 

Yani, kendi uygulama sağlayabilir:

Onun kod benziyor.

İlgili konular