Queueable Apex
Un Queueable es una clase que se mete en la cola. A diferencia de @future, puede guardar estado, recibir registros, devolverte un Id para seguirlo y encolar el siguiente paso cuando termina.
✓ En esta sub-lección
- 01Escribir una clase que implemente Queueable y encolarla con System.enqueueJob.
- 02Encadenar trabajos: que cada uno procese una tanda y encole el siguiente.
- 03Seguir un trabajo por su Id en AsyncApexJob.
La nutria: ¿Te acuerdas? · Repaso de la lección 2
Un @future ha terminado de avisar al ERP y quieres lanzar un segundo paso. ¿Puede llamar a otro @future?
Las 300.000 renovaciones de la migración ya están en Salesforce, en un objeto de preparación, ERP_Renewal__c, esperando a convertirse en oportunidades. El importador del Módulo 8 sabe convertirlas, pero de 300.000 en una transacción, no. Hay que trocear: 200 por trabajo, y que cada trabajo lance el siguiente.
Una interfaz, un método
public class RenewalMigrationJob implements Queueable {
public void execute(QueueableContext ctx) {
// lo que hay que hacer, en su propia transacción asíncrona
}
}
Id jobId = System.enqueueJob(new RenewalMigrationJob()); // a la colaComo es un objeto, un Queueable puede tener atributos y constructor: puedes pasarle una lista de registros, un contador o la fase del proceso. Y System.enqueueJob te devuelve un Id: con él consultas AsyncApexJob (Status, NumberOfErrors) o lo ves en Setup → Apex Jobs. Con @future no tenías ni lo uno ni lo otro.
Encadenar: el trabajo que se relanza
Dentro de execute puedes encolar otro trabajo, uno solo. Esa es la llave de la migración: cada trabajo consulta las siguientes 200 filas sin procesar, las procesa y, si ha llenado la tanda, se encola de nuevo. Cuando una tanda sale incompleta, ya no quedan más y la cadena se detiene sola.
LA CADENA · CADA ESLABÓN, UNA TRANSACCIÓN
- #1 · 200
- #2 · 200
- #3 · 200
- #4 · 200
- #5 · 100
filas procesadas
0
pendientes
900
Paso 1 de 6
Cada trabajo toma 200 filas y, si ha llenado la tanda, se encola otra vez. Pulsa Reproducir.
La nutria: ¿Y por qué no un Flow? Porque un flow no se relanza a sí mismo