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 respuestas
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.
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();
}
});
}
Nuevas preguntas
spring
Spring Framework es un marco de código abierto para el desarrollo de aplicaciones en la plataforma Java. En esencia, es un soporte completo para arquitecturas basadas en componentes, y actualmente cuenta con más de veinte módulos altamente integrados.