Saltar al contenido

¿Cómo ejecutar un trabajo programado cada 15 minutos?

Solución:

Los trabajos no se pueden programar en incrementos inferiores a una hora. Lea la documentación para aprender cómo puede programar trabajos que se ejecuten en patrones más complejos que los que permite la GUI.

En Apex, puede programar cuatro trabajos por hora, escalonados con 15 minutos de diferencia:

System.schedule('Scheduled Job 1', '0 0 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 2', '0 15 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 3', '0 30 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 4', '0 45 * * * ?', new ScheduledClass());

@Christian tiene razón, pero puedes combinar todo eso en una sola línea para ser más eficiente.

System.schedule('Scheduled Job 1', '0 0,15,30,45 * * * ?', new ScheduledClass());

Editar

Parece que estaba equivocado, solo puede usar listas separadas por comas para unidades de horas o más. Minutos y segundos no admite una lista separada por comas, por lo que parece que está atascado programando 4 trabajos como se muestra a continuación, o se está volviendo creativo programando un trabajo siguiente en el método Finish () de su clase por lotes.

System.schedule('Scheduled Job 1', '0 0 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 2', '0 15 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 3', '0 30 * * * ?', new ScheduledClass());
System.schedule('Scheduled Job 4', '0 45 * * * ?', new ScheduledClass());

He estado jugando con algo como esto para lograr la ejecución periódica de una operación con una granularidad tan baja como 1 o 2 minutos. Es una clase que implementa la interfaz Programable. En su método “ejecutar”, simplemente reprograma una nueva instancia de sí mismo en algún momento en el futuro (especificado por el parámetro “intervalMinutes”, luego aborta su instancia actualmente programada e invoca un método futuro o lanza un trabajo por lotes para hacer lo real Lo bueno de este enfoque es que no requiere múltiples trabajos de Apex programados (nunca hay más de uno programado a la vez). Parece estar funcionando bastante bien. ¿Ve algún inconveniente potencial en este enfoque?

global without sharing class JobRunner implements Schedulable {
    Integer intervalMinutes;
    public JobRunner(Integer intervalMinutes) {
        this.intervalMinutes = intervalMinutes;
    }
    public void execute(SchedulableContext sc) {
        // Re-schedule ourself to run again in "intervalMinutes" time
        DateTime now  = DateTime.now();
        DateTime nextRunTime = now.addMinutes(intervalMinutes);
        String cronString = '' + nextRunTime.second() + ' ' + nextRunTime.minute() + ' ' + 
            nextRunTime.hour() + ' ' + nextRunTime.day() + ' ' + 
            nextRunTime.month() + ' ? ' + nextRunTime.year(); 
        System.schedule(JobRunner.class.getName() + '-' + now.format(), cronString, new JobRunner(intervalMinutes));
        // Abort the current job
        Id jobId = sc.getTriggerId();
        System.abortJob(jobId);     
        // Launch a batch job or call a future method to do the actual work
        Database.executeBatch(new SomeBatchJob());
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *