Apex Academy
Módulo 9·05·25 min

Scheduled Apex

Una clase Schedulable se ejecuta sola, cuando dice una expresión cron: a las 2:00 de lunes a viernes, el último día del mes o cuando necesites. Casi siempre, lo que hace es lanzar un Batch o un Queueable.

En Admin esUn flow programado, con toda la precisión que quieras

✓ En esta sub-lección

  1. 01Escribir una clase Schedulable que lance un Batch.
  2. 02Leer y escribir una expresión cron.
  3. 03Programarla con System.schedule y encontrarla en Setup.

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

¿Qué línea lanza el Batch de la migración en tandas de 200?

La migración ya es un Batch, pero cada mañana alguien del equipo abre Execute Anonymous y lo lanza a mano. El día que esa persona se va de vacaciones, la migración se para. Northwind quiere que arranque sola, de noche, cuando nadie usa la org.

Una interfaz más, un execute más

Apex
public class RenewalMigrationScheduler implements Schedulable {
    public void execute(SchedulableContext sc) {
        Database.executeBatch(new RenewalMigrationBatch(), 200);   // lo pesado, en el Batch
    }
}

System.schedule('Migración ERP · noches laborables', '0 0 2 ? * MON-FRI', new RenewalMigrationScheduler());
System.schedule recibe tres cosas: un nombre para el trabajo, la expresión cron y la instancia que se ejecutará.

El Schedulable es solo el despertador: su execute debería hacer poco y lanzar el trabajo de verdad, normalmente un Batch o un Queueable. Así lo pesado corre con sus propias tandas y su propio presupuesto. Si además necesitas llamar a otro sistema, tampoco se hace aquí directamente: se lanza un @future(callout=true) o un Queueable que lo haga.

La expresión cron: siete posiciones

Una se lee de izquierda a derecha: segundos, minutos, horas, día del mes, mes, día de la semana y, opcional, año. El asterisco significa «todos». Y una regla de Salesforce: día del mes y día de la semana no pueden ir los dos fijados; en uno de ellos va un interrogante, «me da igual».

¿A QUÉ HORA?

¿QUÉ DÍAS?

0

segundos

0

minutos

2

horas

?

día del mes

*

mes

MON-FRI

día de la semana

System.schedule('…', '0 0 2 ? * MON-FRI', new RenewalMigrationScheduler());

A las 2:00, de lunes a viernes. Fijas el día de la semana, así que el día del mes lleva ?.

Elige cuándo tiene que arrancar el trabajo y mira cómo se escribe la expresión, posición a posición.

La nutria: ¿Y por qué no un Flow? Porque un flow programado no lanza tu Batch

Un flow programado arranca a una hora, con frecuencia única, diaria o semanal; para saltarte el fin de semana basta una Decision que mire el día. Hasta ahí, Flow llega. Pero no hay ningún elemento que lance un Batch de Apex: haría falta una acción escrita en Apex solo para eso. Y hay horarios que su frecuencia no expresa, como «el último día de cada mes», que en cron es una L en el día del mes.