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?
7
A
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
- 1. Geçerli durum koduna göre durum kodu açıklamasını göster
- 2. cURL PHP'de yeniden deneme
- 3. session.gc_maxlifetime> 65535 saniye olarak ayarlanabiliyor mu?
- 4. BroadcastReceiver önceliği programlı olarak ayarlanabiliyor mu?
- 5. GAE'nin cron yeniden deneme parametreleri
- 6. httpStatus ve DownloadData
- 7. Bluebird Promise Yeniden Deneme BelgesiDB isteği
- 8. RabbitMQ'de yeniden deneme denemesi sayısını nasıl belirlerim?
- 9. Swift "yeniden deneme" mantığı istek üzerine
- 10. Vps_ip'im, wget'in kullanımına izin verecek bir proxy olarak ayarlanabiliyor mu?
- 11. Python'dan bir ortam değişkeni kalıcı olarak ayarlanabiliyor mu?
- 12. Vim durum çubuğu tahmini/tamamlanıyor mu?
- 13. Aynı işçi kullanarak kereviz yeniden deneme nasıl yapılır?
- 14. ruby: komut dosyasının 3. yeniden deneme olup olmadığını nasıl öğrenebilirim?
- 15. Polly framework CircuitBreakerAsync, istisna oluşursa yeniden deneme yapmaz.
- 16. NET'te özgeçmişi/yeniden deneme desteğiyle HTTP'den büyük dosya indirilsin mi?
- 17. dahili hata: henüz deneme ayarlı değil sınıfı yeniden deneyin
- 18. OmniAuth Google OpenID WEBrick :: HTTPStatus :: RequestURITooLarge
- 19. java.net.HttpRetryException: Sunucu kimlik doğrulaması nedeniyle yeniden deneme yapamazsınız, akış modunda
- 20. İnternet bağlantısı geri geldiğinde yeniden deneme isteği - IOS
- 21. SHA1 koduna göre Git nesne türü nasıl belirlenir?
- 22. Pencerede yeniden boyutlandırma meteor.js yeniden boyutlandırılıyor mu?
- 23. Önyükleme sütunlarını veri özniteliğine göre yeniden sırala
- 24. Ajax uygulamasında bir sunucudan javascript koduna veri iletiliyor mu?
- 25. UNALIGNED MSVC'ye özel kod taşınabilir C++ koduna dönüştürülüyor mu?
- 26. socket.io yeniden bağlanmayı yeniden bağlanıyor mu?
- 27. Yeniden bağlanma olayında soketler yeniden kullanılıyor mu?
- 28. 502 veritabanı hatası için uygun bir durum kodu mu?
- 29. Her değişiklikten sonra konteyner yeniden oluşturulsun mu?
- 30. Sonunda bir deneme/yakalama yapmak için tamam mı?
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. –
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. –
Ş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. –