Como modificar un batch que se encuentra programado sin detener la programación

Aquellos que han hecho un batch en Apex y lo han programado saben que al momento de querer modificarlo en producción, por ejemplo a través de un conjunto de cambios, siempre nos encontramos con el mensaje

This Apex class has batch or future jobs pending or in progress

o en español

Esta clase programable tiene trabajos pendientes o en curso

La solucion rápida es desprogramar el trabajo. Implementar el conjunto de cambios y volver a reprogramar. Tan solo que algunas veces no sabemos que clase especificamente es la que está programada o se nos olvida revisar la configuración exacta que tenia la programación antes de eliminarla. Problemas que se solucionan con un poco de paciencia y cuidado.

Image result for patience free image"

Aunque desde el release Winter ’15 existe la opción de poder implementar clases que tengan trabajos pendientes o en curso

Ir a Configuración -> Ajustes de implementación

Si queremos tener mas control sobre que clases pueden implementarse cuando hay programaciones en curso, podemos utilizar otro enfoque, uno que en sus días fue explicado por Dan Appleman y hace uso entre otros del concepto de Reflexión en Apex.

Ver: Intriguing Design Pattern for Scheduled APEX

Reflexión en Apex

La capacidad de un programa de modificar su estructura de manera dinámica es conocido en otros lenguajes como Reflexión. En Apex contamos con la clase Type pero en otros lenguajes hay mas herramientas.

La solución explicada por Dan consiste en crear una clase programable (que no se va a modificar posteriormente)

Esta clase que implementa Schedulable declara su propia interfaz que es igual en su definición a la de una clase programable.

El secreto está en el uso de la clase Type que con su método forName, nos permite crear una instancia de nuestra clase Batch (o cualquier otra que deseemos programar) en tiempo de ejecución, por lo que la clase programable no sabrá que clase es, hasta que se ejecute.

Así podremos modificar nuestra clase posterior a que se encuentre programada

La clase que vamos a programar sería asi

Simplemente implementa la interfaz que definimos dentro de nuestra clase programable.

Para mas información de la clase Type ver Apex Developer Guide: Type Class

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: