retryable retry java spring spring-boot google-cloud-messaging resttemplate

java - retry - Spring RestTemplate: política de rebobinado de backoff exponencial



resttemplate retry (1)

Estoy leyendo en GCM: https://developers.google.com/cloud-messaging/server

y uno de los requisitos es que el servidor debe ser capaz de:

  • maneja las solicitudes y las vuelve a enviar usando un retroceso exponencial.

Utilizo Spring RestTemplate para mi backend que proviene de Spring Boot. No parece haber un método que pueda usar para establecer mi política de reintento en los documentos: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/ RestTemplate.html

También cuando busqué en Google, encontré RetryTemplate, pero es parte de Spring Batch y no extiende RestTemplate, lo que me hace pensar que no se debe usar para operaciones de descanso, sino más bien operaciones de Spring Batch, como procesar grandes cantidades de transacciones. : http://docs.spring.io/spring-batch/2.1.x/apidocs/org/springframework/batch/retry/support/RetryTemplate.html

¿Hay alguna manera de que pueda utilizar el retroceso exponencial con Spring RestTemplate?


¡Buen día!

Supongo que se podría lograr el comportamiento deseado mediante la implementación de clases Sleeper personalizadas.

A continuación, debe configurar este dispositivo a BackOffPolicy de la siguiente manera:

public class RetryTest { public static final Logger LOG = LoggerFactory.getLogger(RetryTemplate.class); @org.junit.Test public void testRT() { RetryTemplate retryTemplate = new RetryTemplate(); final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(5); retryTemplate.setRetryPolicy(retryPolicy); Sleeper sleeper = new Sleeper() { private long timeToSleep = 0; @Override public void sleep(long timeout) throws InterruptedException { if (timeToSleep ==0) { timeToSleep = timeout; } else { timeToSleep = (long) (timeToSleep * Math.E); } LOG.warn("sleeping for: {}", timeToSleep); Thread.sleep(timeToSleep); } }; FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy().withSleeper(sleeper); retryTemplate.setBackOffPolicy(backOffPolicy); retryTemplate.execute(new RetryCallback<Void, ResourceAccessException>() { @Override public Void doWithRetry(RetryContext retryContext) throws ResourceAccessException { LOG.debug(">RetryCount: {}", retryContext.getRetryCount()); new RestTemplate().getForObject("https://unreachable.host", String.class); return null; } }); } }

También existe ExponentialBackOffPolicy por spring-retry.

Espero que esto ayude.