Apex Academy
Módulo 11·06·30 min

Callouts en asíncrono

Un callout desde un trigger tiene que ir en un trabajo asíncrono. Y ahí puedes hacer algo que en el guardado no cabría: si el otro sistema falla, volver a intentarlo más tarde, un número limitado de veces.

En Admin esReenviar un correo que rebotó, pero solo tres veces

✓ En esta sub-lección

  1. 01Sacar un callout de un trigger a un Queueable con Database.AllowsCallouts.
  2. 02Reintentar con un contador de intentos y un tope.
  3. 03Decidir qué hacer cuando se agotan los intentos.

La nutria: ¿Te acuerdas? · Repaso de la lección 5

¿Qué lanza port.createInvoice(…) si el sistema de facturación no responde?

Al cerrarse una renovación hay que pedir su factura. El primer intento fue llamar a InvoiceClient desde el trigger: «Callout from triggers are currently not supported». El segundo, un Queueable: funciona, hasta la noche en que el sistema de facturación se cae diez minutos para una actualización y veinte facturas se quedan sin pedir.

Las reglas, juntas

  • Desde un trigger, el callout va en un @future(callout=true) o en un Queueable con Database.AllowsCallouts (Módulo 9).
  • Dentro del trabajo, primero el callout y después el DML, nunca al revés.
  • Un trabajo asíncrono tiene los mismos límites de callouts: 100 por transacción y 120 segundos entre todos.
  • Un Queueable puede encolar un hijo: es la pieza que permite reintentar.

Reintentar, con tope

Apex
} catch (ErpApiException e) {
    if (attempt < MAX_ATTEMPTS) {
        System.enqueueJob(new InvoiceRetryJob(erpCode, amount, attempt + 1));   // otra vez, más tarde
    } else {
        System.debug(LoggingLevel.ERROR, 'Sin factura tras ' + attempt + ' intentos');   // se acabó: avisar
    }
}
El número de intento viaja en el propio trabajo, como atributo. Cada reintento es un trabajo nuevo que sabe cuántas veces se ha probado ya.

EL SISTEMA DE FACTURACIÓN VUELVE…

  1. InvoiceRetryJob(…, 1)
  2. InvoiceRetryJob(…, 2)
  3. InvoiceRetryJob(…, 3)

Paso 1 de 4

La renovación se cierra y el handler encola el intento 1. Pulsa Reproducir.

Elige cuándo se recupera el sistema de facturación y sigue los intentos, uno por trabajo.

La nutria: ¿Y por qué no un Flow? Porque un flow no vuelve a intentarlo

En Flow, el callout va en el camino asíncrono, y si falla puedes recogerlo en el fault path para mandar un aviso. Hasta ahí llega. Lo que no hay es una forma de decir «vuelve a probar dentro de un rato, y si a la tercera sigue fallando, para»: la interview termina y no se relanza a sí misma con lo que sabe. En Apex, el trabajo lleva su contador y decide.