Utilizando Spring Retry em Aplicações Spring

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 ————————————————————————

Tags: spring-boot spring-retry java retry-mechanism backend

Publicado em 6-20 02:36