Saltar al contenido

Reintentar una operación fallida en Jitterbit Studio

Introducción

Las fallas transitorias (como respuestas de límite de velocidad de API, tiempos de espera de red breves o indisponibilidad temporal del servicio) pueden causar que una operación por lo demás saludable falle intermitentemente. En lugar de permitir que una única falla detenga una integración, un script controlador de reintentos vuelve a ejecutar la operación automáticamente hasta un número configurado de veces antes de generar un error final.

Esta guía muestra cómo escribir un script controlador de reintentos usando While, RunOperation, GetLastError y RaiseError.

Esta guía asume familiaridad con el uso de scripts para llamar operaciones. Para obtener información de contexto, consulta Encadenar y controlar operaciones. Para consideraciones sobre ejecutar RunOperation de forma asincrónica, consulta Administrar operaciones asincrónicas.

Patrón de diseño

El patrón utiliza dos operaciones:

  • Operación de destino: La operación que puede fallar de forma transitoria, típicamente una que llama a una API externa.
  • Operación controladora: Un único paso de script que llama al destino usando RunOperation dentro de un bucle While con un contador.

Tres variables coordinan el bucle:

  • maxRetries: el número total de intentos a realizar antes de generar un error. Establece esto al número máximo de veces que la operación debe ejecutarse, incluyendo el primer intento.
  • attempt: el contador de intento actual, inicializado en 0 e incrementado al inicio de cada iteración del bucle.
  • success: una bandera inicializada en false y establecida en true cuando RunOperation tiene éxito, lo que sale del bucle anticipadamente.

Parte 1: Configurar la operación de destino

La operación de destino puede ser cualquier operación: una consulta HTTP v2 GET, una consulta de conector o una cadena de transformación. El único requisito es que exista como una operación nombrada en el lienzo de diseño para que RunOperation pueda llamarla por etiqueta.

Si la operación ya está en el lienzo como una operación independiente, no se necesitan cambios. Si actualmente está en línea en una cadena más grande, muévela a su propia operación para que pueda llamarse de forma independiente.

Parte 2: Escribir el script controlador de reintentos

  1. En el lienzo de diseño, crea una nueva operación que contenga solo un paso de Script.

  2. Haz doble clic en el script para abrir el editor e ingresa lo siguiente:

    $maxRetries = 3;
    $attempt = 0;
    $success = false;
    
    While(!$success && $attempt < $maxRetries,
        $attempt++;
        If(RunOperation("<TAG>operation:Call External API</TAG>"),
            $success = true;
        ,
            WriteToOperationLog("Attempt " + $attempt + " of " + $maxRetries + " failed: " + GetLastError());
        );
    );
    
    If(!$success,
        RaiseError("Operation failed after " + $maxRetries + " attempts: " + GetLastError());
    );
    

    Reemplaza Call External API con el nombre exacto de la operación de destino.

  3. Guarda el script.

Puntos clave sobre este script:

  • $maxRetries = 3 significa 3 intentos totales. Ajusta este valor según las características de confiabilidad del endpoint de destino.
  • El bucle sale tan pronto como RunOperation devuelve true (éxito) o después de que se han realizado maxRetries intentos, lo que ocurra primero.
  • WriteToOperationLog registra cada intento fallido en el registro de operaciones, lo que facilita ver cuántos reintentos ocurrieron antes del éxito o falla final.
  • RaiseError(GetLastError()) detiene la operación controladora y expone el último mensaje de error después de que se agotan todos los intentos.
  • RunOperation es sincrónico por defecto, por lo que el bucle espera a que cada intento se complete antes de evaluar la siguiente iteración.
  • RunOperation también está sujeto a un límite a nivel de agente en llamadas sincrónicas realizadas dentro de un único bucle While (50 por defecto). Esto está muy por encima de cualquier valor típico de maxRetries, pero si configuras un contador de reintentos inusualmente alto, consulta la nota bajo RunOperation para obtener detalles.

Consejo

APIs con límite de velocidad: Si reintentas después de una respuesta de límite de velocidad (HTTP 429), agrega una llamada a Sleep antes de RunOperation para hacer una pausa entre intentos (por ejemplo, Sleep(2) espera 2 segundos). Reintentar inmediatamente golpeará el mismo límite de velocidad repetidamente y extenderá la ventana de falla.

Consejo

Para limitar el número de iteraciones de bucle permitidas, establece $jitterbit.scripting.while.max_iterations antes de la llamada While. El límite predeterminado es 50,000 iteraciones, que está muy por encima de cualquier recuento de reintentos práctico, por lo que esto solo es necesario si has configurado un límite global más bajo en otro lugar del proyecto.

Verifica la integración

Implementa y ejecuta la operación del controlador. Consulta los registros de operación: cada intento fallido aparece como una entrada de registro separada. Si todos los intentos fallan, el registro muestra una entrada por intento seguida del error final generado. Si la operación se realiza correctamente en un intento anterior, solo aparecen los fallos hasta ese punto.

Para probar el comportamiento de reintentos antes de ejecutar contra un endpoint en vivo, configura temporalmente la operación de destino para que falle (por ejemplo, ingresando una URL inválida en la conexión) y establece $maxRetries = 2. El registro debe mostrar dos intentos fallidos y un error final generado. Restaura la configuración correcta antes de implementar en producción.