Estoy usando Spring-retry-1.2.0, Reintentar está funcionando bien, pero en mi método quiero averiguar si el nuevo intento es el último o no, ¿Hay algún método disponible para obtener el retrialCount o el último nuevo en spring-retry?

Retrial.java

public class Offers extends SimpleRetryPolicy {

@Async
@Retryable(maxAttemptsExpression = "#{retrial.times}", backoff = @Backoff(delayExpression = "#{retrial.delay}"))
public void handleOfferes(Data data) {

 AlwaysRetryPolicy policy = new AlwaysRetryPolicy();
        RetryContext context = policy.open(null);
        System.out.println("context.getRetryCount()::"+context.getRetryCount()); //Always logs 0 even if it retries 2 to 3 times...
        System.out.println("Can retry::"+canRetry(context)); //Always true
//Business Logic
//Get the last count and update the DB ...retrial is ends with failure
}


@Override
public boolean canRetry(RetryContext context) {
    System.out.println("context.getRetryCount()::"+context.getRetryCount());
    System.out.println("getMaxAttempts::"+getMaxAttempts());
    return context.getRetryCount() < getMaxAttempts();
}
}

Cambios realizados después de los comentarios de Artem Bilan

RetryConfiguration

@Configuration
public class RetryConfiguration {

@Value("${retrial.times}")
private Long delayExpression;

@Value("${retrial.delay}")
private int maxAttempts;

@Bean
@ConditionalOnMissingBean(name = "retryInterceptor")
public RetryOperationsInterceptor retryInterceptor() {
    return RetryInterceptorBuilder
            .stateless()
            .backOffOptions(0L,
                    0.0D, delayExpression)
            .maxAttempts(maxAttempts).build();
}
}

Offers.java

@Service
public class Offers {
@Async
@Retryable(interceptor = "retryInterceptor")
public void handleDeviceStatus(Data data) {
//Here how shall i get the retrial count...

}

Cualquier ayuda sería apreciable.

2
VelNaga 23 mar. 2017 a las 16:24

2 respuestas

La mejor respuesta

Creo que lo que necesita se llama @Recover (RecoveryCallback si no tiene anotaciones):

@Retryable(RemoteAccessException.class)
public void service() {
    // ... do something
}
@Recover
public void recover(RemoteAccessException e) {
   // ... panic
}

Vea el mismo README y test-case al respecto.

4
Artem Bilan 23 mar. 2017 a las 13:40

Si está creando / utilizando manualmente RetryTemplate's, puede obtener el recuento de reintentos actual de RetryContext de la siguiente manera:

public String callWithRetry() {
    return retryTemplate.execute(new RetryCallback<String, RuntimeException>() {
        @Override
        public String doWithRetry(RetryContext context) {
            LOG.info("Retry count: {}", context.getRetryCount());
            return theService.perform();
        }
    });
}
4
isaolmez 13 abr. 2017 a las 14:17