Batch Apex
Batch Apex es la herramienta para millones de registros: tú dices qué registros (start), qué hacer con cada tanda (execute) y qué hacer al final (finish). Salesforce trocea, reparte y lleva la cuenta.
✓ En esta sub-lección
- 01Escribir un Batch con sus tres métodos: start, execute y finish.
- 02Lanzarlo con Database.executeBatch eligiendo el tamaño de tanda.
- 03Usar Database.Stateful para llevar la cuenta entre tandas.
La nutria: ¿Te acuerdas? · Repaso de la lección 3
En la cadena de Queueables de la migración, ¿qué detiene la cadena?
La cadena de Queueables funciona, pero tiene 1.500 eslabones y la condición de parada es cosa tuya: si uno falla, la cadena se detiene ahí. Para recorrer muchos registros de un objeto, Salesforce tiene una herramienta hecha a medida, que trocea, reparte y lleva la cuenta por ti.
Tres métodos: empezar, cada tanda, terminar
public class RenewalMigrationBatch implements Database.Batchable<sObject> {
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT … FROM ERP_Renewal__c WHERE …'); // 1 · qué registros
}
public void execute(Database.BatchableContext bc, List<ERP_Renewal__c> scope) {
// 2 · qué hacer con cada tanda (scope)
}
public void finish(Database.BatchableContext bc) {
// 3 · qué hacer al final: un resumen, un aviso, el siguiente trabajo
}
}
Id jobId = Database.executeBatch(new RenewalMigrationBatch(), 200); // tandas de 200start se ejecuta una vez y devuelve un QueryLocator: la consulta de todos los registros, hasta 50 millones. Salesforce los parte en tandas del tamaño que elijas (por defecto 200, como mucho 2.000) y llama a execute una vez por tanda, cada una en su propia transacción con su presupuesto. Cuando no quedan tandas, llama a finish una vez.
- start · getQueryLocator → 1.000 filas
- execute · tanda 1 (200)
- execute · tanda 2 (200)
- execute · tanda 3 (200)
- execute · tanda 4 (200)
- execute · tanda 5 (200)
- finish · System.debug(processed)
Paso 1 de 8
1.000 filas, tandas de 200. Pulsa Reproducir.
Llevar la cuenta: Database.Stateful
Cada tanda es una transacción nueva, así que las variables del Batch empiezan de cero en cada una. Si quieres un contador que sume a lo largo de todas las tandas (filas procesadas, filas con error), añade Database.Stateful a la cabecera: Salesforce guarda los atributos del objeto entre una tanda y la siguiente, y en finish tienes el total.
La nutria: Es tu Data Loader, sin nadie delante
La nutria: ¿Y por qué no un Flow? Por la escala