Y tú, ¿cómo “Schedule-as” ?

Esta pasada semana tuve una conversación relacionada con “Schedule” Jobs. Creo que si conoces Salesforce quizás estés pensando en estos momentos:

  • Opción 1: Ah ya! Te refieres a cuando se programa para ser ejecutado un proceso Batch
  • Opción 2: No hombre! Te refieres a cuando se programa para que se ejecute una clase
  • Opción 3: Que si! Que te estoy diciendo que es cuando se programa para que se ejecute un proceso batch y lo haces a través de “Developer Console”
  • Opción 4: Que no, que no, que lo que yo digo es programar un proceso cualquiera que no sea Batch para que se ejecute a una hora determinada y lo hago a través de UI

Ya veis por donde va la conversación. Parecía no estar muy claro el concepto y las posibilidades. Pues vamos a verlo

En parte todas las opciones, respuestas son correctas.

Veamos poco a poco todos los casos. Empecemos por:

Apex Scheduler

 Pues este se usa para ejecutar clases a una hora especifica. Y cuando digo clases me refiero a una determinada clase que implemente la interfaz Schedulable. Ahora dentro de esta clase puedes tener un simple código que por ejemplo cree 24 nuevos registros cada día para que así haga referencia a las nuevas 24 horas del día siguiente, o quizás 168 para la semana. Si el proceso es pequeño no tiene sentido llamar a un Batch para que sea ejecutado, seria una mala utilización de los recursos.

Aunque si lo que deseas y procesar todas las cuentas de tu organización y actualizarlas con un nuevo valor quizás Batch sea lo que buscas para no tener problemas de limites.

Luego con Apex Scheduler puedes ejecutar a una determinada hora procesos Batch y procesos que no son Batch.

La clase tendrá esta estructura:


global class ScheduleApexClass implements Schedulable
{
    global void execute(SchedulableContext ctx)
   {

      //aquí es donde se ejecutara lo que desees hacer

   }
}

¿Cómo se programan las ejecuciones?

Hay varias opciones también: ( siempre como Administrador del sistema o con los adecuados permisos)

  1. Puedes programar la ejecución desde la pantalla donde se encuentran todas las clases Apex de tu organización : Setup–> Develop–> Apex Clases.

Screenshot 2014-08-17 09.01.38 Screenshot 2014-08-17 09.02.40

Como ves aquí solamente lo que hacemos es ponerle un nombre a nuestro proceso programado, asociarlo con la clase correspondiente que implementa la interfaz Schedule y el día/hora que queremos se ejecute

  1. La segunda forma es a traves de Developer Console, usando esta línea de código que usa el método System.Schedule:

System.Schedule( “Nombre del proceso”,”cuando”,instancia_de_clase);

Algo como esto:


  ScheduleApexClass s = ScheduleApexClass();

  String sch= ‘0 0 8 13 2 ?’;

  System.Schedule(‘Programado’, sch, s);

A todo esto… ahora qué pasa, ¿Dónde se van mis procesos programados? ¿Cómo los controlo?

 Desde Monitoring–>Schedule Jobs. Aquí es donde aparecen estos procesos programados para que se ejecuten de forma repetitiva en el momento que hemos determinado.

Pero además!! Aquí es donde posiblemente estaba la confusión. Cuando se programa un proceso para que sea ejecutado de forma recurrente, también se crea una entrada en la tabla AsyncApexJob . Dicha tabla es la que muestra procesos Batch.

Importante!! — Sin embargo nuestro proceso que hemos programado puede que sea Batch o puede que no.

Pero el sistema guardara un registro siempre en dicha tabla para saber que tiene que lanzar dicho proceso de forma recurrente y siempre estará en estado “Queued”

Para ver dichos procesos solamente has de dirigirte a Monitoring–>Apex Jobs

Y todo esto era la parte de Apex Scheduler.

 

Pero la segunda parte es:

Programar un proceso batch directamente!!

Para ello podrías usar la versión que acabamos de ver, donde dentro de la clase hacemos la llamaba a nuestra clase Batch


global class ScheduleApexClass implements Schedulable{

    global void execute(SchedulableContext ctx)
    {
       MyBatch b = new MyBatch();
       Database.executeBatch(b,1);
    }
}

Esto lo que hará entonces es ejecutar mi proceso Batch definido en MyBatch, de forma repetitiva recurrente cada vez que yo lo haya especificado a la hora de lanzarlo ( con System.Schedule o a través de UI)

Pero quizás yo no quiera eso, lo que yo quiero es que mi proceso batch sea ejecutado una sola vez y a una hora determinada.

Para ello lo que debo hacer es solamente ejecutar el método a través de Developer Console por ejemplo:

System.ScheduleBatch( batchClass, “nombre del proceso”, intervalo de tiempo para que sea lanzado)

Para este sistema la clase que usamos es una simple clase Batch, no necesita que implemente la interfaz Schedulable ( pero obviamente implementará la interfaz Database.Batchable)

Luego seria algo como esto:


   MyBatch mb = new MyBatch();

   String b1ID = System.scheduleBatch(mb, 'My Batch', 5);

Y lo que tengo es que en  5 minutos mi clase batch será lanzada.

Si te vas Monitoring–> Schedule Jobs, versa que hay un Nuevo registro pero sin embargo no existe Nuevo Registro hasta que se ejecute el proceso Batch en 5 minutos en la table de AsyncApexJobs.

Esta es otra de las diferencias de programar un Batch directamente.

Espero que haya servido de ayuda. Hasta pronto!!

 

2 comments

  1. Saludos!

    Por casualidad hoy he dado con tu blog y me parece interesante el tema Schedule. Me gustaría que tocaras un poco el problema que tienen las clases Schedule cuando son programadas de forma recurrente, ejemplo:

    Tengo un problema con unas clases schedule que estan programadas para ejecutarse cada 3 minutos funcionan de manera perfecta.

    El problema radica en que si las clases están en productivo y desde sandbox se actualiza o agrega nuevo código y quieres migrar estos cambios a productivo, salesforce te responde con que la case esta programada y que no puede sufrir modificaciones.

    Previo a esto he eliminado todos los trabajos programados y mi tabla de trabajos pendientes esta vacía.

    Leí en varios foros que esto no tiene solución, pero me gustaría saber si tu sabes algo sobre el tema.

    1. Hola Alejandro,
      Muchas gracias por leer mi blog y ponerte en contacto conmigo, y antes de nada perdón por haber tardado en contestar.

      Como comentas Salesforce tiene una limitación que no te permite actualizar las clases que están en Procesos programados activos, estos deben ser parados/borrados antes del nuevo deploy / actualización.

      Como bien dices había un problema cuando tienes una clase “programada”. De hecho en Winter 13 , pero creo que se solucionó. (Issue)

      Cuando me comentas tu caso, tu proceso programado aparece tanto en la tabla de Schedule Jobs como en la Tabla de Apex Jobs, en esta última aparece siempre en estado “queued”

      Me dices que tu proceso esta programado para que se ejecute cada 3 minutos, dicho proceso ¿llama a alguna clase batch? Te pregunto, porque si en el caso que justamente borras el proceso programado pero se esta ejecutando el batch en ese momento el deploy fallaría.

      Lo recomendable a la hora de actualizar tu org de producción, si necesitas cambiar clases que forman parte de Schedule Jobs, es que borres dichos procesos, compruebes que ya no aparecen ni en la tabla de Schedule Jobs ni en la tabla de Apex Jobs, y que a su vez te asegures si existe algún proceso batch asociado a tu proceso programado que este haya terminado.
      Una vez todo ha sido borrado y en ciertos casos ejecuciones han terminado, entonces es cuando es recomendable hacer “deploy” de tus nuevos cambios.

      Asegurate también que dicha clase no esta siendo usada por ningún otro proceso o lógica, como usuario, UI o API, luego adicionalmente quizás también quieras hacer la actualizacio de tu entorno a una hora en la que no haya usuarios conectados.

      Si aun así, no te permite actualizar dicha clase, lo mas recomendable es contactar con Soporte de Salesforce, para que ellos se conecten a tu organización y miren que quizás haya algún proceso que se haya quedado colgado de alguna manera y no te sea accesible.

      He visto en la comunidad que gente tenia este problema pero como te comentaba creo que apareceio tras Winter ’13 , pero que se solucionó en las siguientes, pero quizás comentan algo que se me ha pasado: algunas respuestas

      Espero tu respuesta,si puedo ayudar en algo más solamente dime. Si, aún sigue pasando y piensas que quizás puedo echarle un vistazo podemos programar un GoToMeeting y ver el problema.

      Hasta pronto!
      Que tengas un buen fin de semana 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s