O Spring Retry oferece uma abordagem declarativa para tratar operações que podem falhar, permitindo que você configure repetições automáticas quando exceptions occurrem. A seguir, apresento os passos fundamentais para integrar o Spring Retry em sua aplicação.
Adicionando a Dependência
Primeiramente, é necessário incluir a dependência do Spring Retry no arquivo pom.xml do seu projeto. Caso esteja utilizando Spring Boot, a dependência pode já estar incluída automaticamente.
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>2.0.0</version>
</dependency>
Ativando o Retry na Classe de Inicialização
// Habilita a funcionalidade de repetição automática
@EnableRetry
public class AplicacaoPrincipal {
public static void main(String[] args) {
SpringApplication.run(AplicacaoPrincipal.class, args);
}
}
Configurando Anotações de Repetição e Recuperação
A anotação @Retryable marca métodos que devem ser repetidos autommaticamente quando uma exception ocorrer. Você pode especificar quais tipos de expection devem acionar a repetição, além do número máximo de tentativas e o intervalo entre elas.
A anotação @Recover define um método deallback que será invoked após esgotar todas as tentativas de repetição.
/**
* Serviço para demonstração do Spring Retry
*/
@Service
public class ProcessoTarefaService {
private static final Logger logger = LoggerFactory.getLogger(ProcessoTarefaService.class);
// Configura até 3 tentativas de repetição em caso de Exception
// Espera 1 segundo na primeira tentativa, dobrando o tempo a cada tentativa subsequente
@Retryable(value = {Exception.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2))
public void executarTarefa() {
// Simula uma operação que pode falhar
logger.error("Executando【ProcessoTarefaService.executarTarefa】- falha simulada!");
throw new RuntimeException("Erro ao executar【ProcessoTarefaService.executarTarefa】");
}
@Recover
public void tratarFalha(Exception e) {
// Lógica executada quando todas as tentativas falham
logger.info("Método de recuperação【ProcessoTarefaService.tratarFalha】executado com sucesso!");
}
}
Exemplo de Teste
/**
* Testes para ProcessoTarefaService
*/
public class ProcessoTarefaServiceTest extends AplicacaoPrincipalTests {
private static final Logger logger = LoggerFactory.getLogger(ProcessoTarefaServiceTest.class);
@Resource
private ProcessoTarefaService processoTarefaService;
@Test
public void verificarRepeticao() {
processoTarefaService.executarTarefa();
PrintUtil.println("Execução do método【processoTarefaService.executarTarefa】concluída!");
}
}
Resultado da Execução
———————————————————————— Início do Teste ————————————————————————
2024-10-25 14:30:15,247 ERROR [main] p.s.c.p.ProcessoTarefaService.executarTarefa(25): Executando【ProcessoTarefaService.executarTarefa】- falha simulada!
2024-10-25 14:30:16,251 ERROR [main] p.s.c.p.ProcessoTarefaService.executarTarefa(25): Executando【ProcessoTarefaService.executarTarefa】- falha simulada!
2024-10-25 14:30:18,259 ERROR [main] p.s.c.p.ProcessoTarefaService.executarTarefa(25): Executando【ProcessoTarefaService.executarTarefa】- falha simulada!
2024-10-25 14:30:18,259 INFO [main] p.s.c.p.ProcessoTarefaService.tratarFalha(32): Método de recuperação【ProcessoTarefaService.tratarFalha】executado com sucesso!
Execução do método【processoTarefaService.executarTarefa】concluída!
———————————————————————— Fim do Teste ————————————————————————