Apex Academy
Módulo 9·04·35 min

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 Admin esData Loader con su tamaño de lote, pero dentro de Salesforce

✓ En esta sub-lección

  1. 01Escribir un Batch con sus tres métodos: start, execute y finish.
  2. 02Lanzarlo con Database.executeBatch eligiendo el tamaño de tanda.
  3. 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

Apex
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 200

start 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.

  1. start · getQueryLocator → 1.000 filas
  2. execute · tanda 1 (200)
  3. execute · tanda 2 (200)
  4. execute · tanda 3 (200)
  5. execute · tanda 4 (200)
  6. execute · tanda 5 (200)
  7. finish · System.debug(processed)

Paso 1 de 8

1.000 filas, tandas de 200. Pulsa Reproducir.

Lanza el Batch y mira cómo start, las tandas y finish se reparten en transacciones distintas. Prueba a hacer fallar una tanda.

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

Yo lo entendí así: el tamaño de tanda es el «Batch size» de la configuración de Data Loader, y Setup → Apex Jobs es mi pantalla de resultados, con las tandas procesadas y las que fallaron. La diferencia es que aquí no hay nadie delante del portátil: el Batch se lanza desde código, a cualquier hora, y lo que en Data Loader era el error.csv lo decides tú en execute y en finish.

La nutria: ¿Y por qué no un Flow? Por la escala

Un flow programado es lo más parecido a un Batch: recorre registros en tandas de hasta 200. Pero cada registro es una interview, y el máximo diario es de 250.000 interviews (o 200 por licencia de usuario, si es mayor), para toda la org. Un Batch recorre hasta 50 millones de registros en un solo trabajo, y el tamaño de cada tanda lo eliges tú.