Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Retry em timeout

Como fazer um retry em caso de timeout de uma thread?

1 resposta
solução!

Em Java, você pode implementar um mecanismo de "retry" (tentativas repetidas) em caso de timeout de uma thread utilizando um loop e o uso de Thread.sleep() para adicionar um atraso entre as tentativas. Aqui está um exemplo de como você pode fazer isso:

public class RetryThread implements Runnable {
    private int maxRetries; // Número máximo de tentativas
    private long retryDelay; // Tempo de atraso (em milissegundos) entre as tentativas
    private boolean success; // Variável para verificar se a tarefa foi bem-sucedida

    public RetryThread(int maxRetries, long retryDelay) {
        this.maxRetries = maxRetries;
        this.retryDelay = retryDelay;
        this.success = false;
    }

    @Override
    public void run() {
        int retries = 0;
        while (!success && retries < maxRetries) {
            try {
                // Realize a tarefa que você deseja executar na thread aqui
                // Por exemplo, uma operação de rede ou IO que pode lançar um TimeoutException

                // Simule um cenário de timeout
                throw new TimeoutException("Operação expirou");

                // Se a tarefa for concluída com sucesso, defina a variável success como true
                // success = true;
            } catch (TimeoutException e) {
                System.out.println("Timeout da tarefa, tentando novamente...");
                retries++;

                // Aguarde o tempo de atraso antes de tentar novamente
                try {
                    Thread.sleep(retryDelay);
                } catch (InterruptedException ex) {
                    // Lida com a interrupção da thread, se necessário
                    ex.printStackTrace();
                }
            }
        }

        if (success) {
            System.out.println("Tarefa concluída com sucesso!");
        } else {
            System.out.println("Tentativas esgotadas, não foi possível concluir a tarefa.");
        }
    }

    public static void main(String[] args) {
        int maxRetries = 5; // Número máximo de tentativas
        long retryDelay = 1000; // Tempo de atraso entre as tentativas (1 segundo)

        RetryThread retryThread = new RetryThread(maxRetries, retryDelay);
        Thread thread = new Thread(retryThread);
        thread.start();
    }
}

Neste exemplo, a classe RetryThread implementa a interface Runnable, o que permite que ela seja executada em uma thread. A lógica de "retry" está contida no método run(). Quando uma exceção de timeout (ou qualquer outra exceção relevante para o seu caso) ocorre na tarefa que está sendo executada na thread, a thread irá tentar novamente (até atingir o número máximo de tentativas ou até que a tarefa seja concluída com sucesso).

Observe que, no exemplo, estamos simulando um cenário de timeout lançando uma exceção TimeoutException. No seu código real, você precisará substituir essa parte pela tarefa que você deseja realizar na thread. Além disso, você pode ajustar o número máximo de tentativas e o tempo de atraso entre as tentativas conforme necessário para atender aos requisitos do seu aplicativo.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software