Volver al código Java

Reintentar una llamada que falla, esperando cada vez más

Reintentos con espera exponencial y un poco de azar, para no golpear a un servicio que ya está caído.

El problema

Una llamada a un servicio externo falla de vez en cuando. Reintentar de inmediato y sin límite empeora la caída; no reintentar convierte un parpadeo en un error para el usuario.

Java
import java.util.concurrent.Callable;

public class Reintento {
    public static <T> T conBackoff(Callable<T> tarea, int intentos) throws Exception {
        long espera = 200;                       // milisegundos
        for (int i = 1; ; i++) {
            try {
                return tarea.call();
            } catch (Exception e) {
                if (i >= intentos) throw e;      // se acabaron: que suba el error real
                System.out.printf("Intento %d falló (%s). Espero %d ms%n", i, e.getMessage(), espera);
                Thread.sleep(espera + (long) (Math.random() * 100));
                espera *= 2;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        String r = conBackoff(() -> {
            if (Math.random() < 0.7) throw new RuntimeException("servicio caído");
            return "respuesta";
        }, 5);
        System.out.println(r);
    }
}

Por qué está escrito así

  1. La espera se duplica en cada intento: 200, 400, 800 ms. Le da aire al servicio para recuperarse.
  2. El azar sumado (jitter) evita que cien clientes reintenten todos en el mismo milisegundo.
  3. Cuando se agotan los intentos se relanza la excepción original, no una genérica: el que investiga ve la causa real.
  4. El método es genérico: sirve para cualquier tarea que devuelva algo.
Cómo probarlo

Guardalo como Reintento.java y corré: java Reintento.java. Cada corrida falla una cantidad distinta de veces.

Ojo con esto

Solo se reintenta lo que es seguro repetir. Reintentar un cobro o un envío de correo sin una clave de idempotencia duplica la operación.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo este reintento con backoff en Java. Adaptalo para que solo reintente ante estas excepciones: [EXCEPCIONES REINTENTABLES], tenga un tope de espera de [TOPE] segundos y registre cada intento con [MI LIBRERÍA DE LOGS]. Es para llamar a [QUÉ SERVICIO]. Decime también si esa operación es segura de reintentar y qué haría falta si no lo es.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.