### Servir el café: Cómo crear y programar una tarea ¿No te gustaría que una taza de café caliente te esperara justo al llegar a la oficina? ¡Vamos a automatizar eso! Cache e IRIS incorporan un Administrador de tareas, que debería resultar familiar a quienes estén acostumbrados a utilizar el programador de tareas de Windows o a usar cron en Linux. Tu cuenta de usuario requerirá tener acceso al recurso %Admin_Task para utilizarlo, y puedes acceder a él desde el portal de administración en System Operation -> Task Manager. Cuando se instala por primera vez, hay aproximadamente 20 tipos de tareas que puedes programar. Si quieres añadir tus propias tareas, empieza creando una clase que extienda `%SYS.Task.Definition`. Como mínimo, debes sobreescribir el método OnTask, que tiene una firma de `Method OnTask() As %Status`. El código de ese método se ejecutará cada vez que se lance la tarea. De hecho, si tu tarea arroja "Error #5003: No implementado (Error #5003: Not Implemented)" cada vez que se ejecuta, es porque este método no se sobreescribió correctamente. De manera muy básica, podría ser:
Class User.Pour Extends %SYS.Task.Definition
{
    Method OnTask() As %Status
    {
        write "Pour the coffee!",!
        quit $$$OK
    }
}

Una vez que hayas desarrollado esa clase, puedes volver al portal de administración e ir a System Operation -> Task Manager -> New Task. Esta vez, si cambias el Namespace para ejecutar la tarea en el menú desplegable al *namespace* donde creaste esta clase, al hacer clic en el menú desplegable "Task type" y deberías ver tu nueva clase, en este caso User.Pour. También podrás darle a tu tarea un nombre y una descripción. Estos aparecerán en el Task Schedule una vez que hayas programado tu tarea. Elige un usuario con el que se ejecutará la tarea. Este usuario deberá tener los permisos adecuados que le permitan ejecutar cualquier código que se encuentre en el método OnTask.

También deberías indicar que la opción "Abrir el archivo de salida cuando la tarea está en ejecución (Open output file when task is running)" la tengas activada (Sí), y seleccionar un archivo para la salida. Cualquier sentencia en forma escrita o similar en la tarea se escribirá en ese archivo, y como eso es todo lo que hace nuestra tarea, no veremos un gran resultado si no configuramos esta parte. Este archivo se iniciará de nuevo cada día, no se anexará, por lo que solamente verás lo que se escribió desde que se ejecutó su tarea más reciente.  

 

Haz clic en "Next" para ver las opciones de programación. Verás que se puede ejecutar la tarea de forma automática diariamente, semanalmente, mensualmente (como en "el día 15 de cada mes"), o mensualmente por día (como en "el segundo martes de cada mes"). Las dos últimas opciones son un poco diferentes, ya que no necesariamente ejecutan una tarea a una hora específica programada.

"After another task completes" (Después de que se complete otra tarea) es útil para encadenar varias tareas en un orden determinado. Por ejemplo, una vez que tengamos esta tarea en el horario, podríamos crear una segunda tarea y llamarla "Add the creamer" (Añadir la leche) y cada vez que la tarea "Pour the coffee" (Servir el café) se complete, la tarea "Add the creamer" también se ejecutará, y siempre ocurrirán en ese orden, incluso si por alguna razón Servir el café llevó más tiempo de lo normal un día. Si la tarea Servir el café falla, no se ejecutará la tarea Añadir la leche en polvo.

"On Demand" (A Demanda) no añade la tarea al horario. En su lugar, solo crea una entrada en el portal de administración en System Operation -> Task Manager -> On Demand Task. De hecho, cualquier tarea, incluyendo las del horario, puede ejecutarse cuando se solicita a partir de ahí, o desde el propio Task Schedule. Solo ten en cuenta que cuando se ejecuta una tarea de esta manera, no se ejecuta inmediatamente. Está programada dentro del siguiente minuto.

Cuando hayas configurado tu horario y hayas hecho clic en "Finalizar", ¡felicidades! ¡Has programado tu primera tarea! Si miras el Task Schedule del Administrador de tareas, verás tu tarea en la parte inferior del horaio. En mi caso, he puesto Pour the coffee a las 9 de la mañana (¡sé que dormir hasta tan tarde es un poco extravagante para la mayoría de nosotros!) todos los días de la semana. En los días programados, mi archivo de salida se reescribirá para decir "Pour the coffee!", justo después de las 9:00 AM.


Son las cinco en algún lugar: Cómo crear opciones para tu tarea

¡¿Pero qué sucede a la hora de la salida?! No siempre queremos café. Necesitamos ser capaces de incorporar algunas opciones a nuestra tarea. Cualquier cosa que definas como una propiedad dentro de tu clase de tarea creará un aviso al programar la tarea. Vamos a añadir una propiedad a nuestra tarea y modificar el método OnTask para utilizarla:

Class User.Pour Extends %SYS.Task.Definition
{ 
    Property Beverage As %String(DISPLAYLIST = ",coffee,bourbon", VALUELIST = ",coffee,bourbon") [ Required ]; 
    Method OnTask() As %Status
    {
        write "Pour the "_..Beverage_"!",!
        quit $$$OK
    }
}

En este ejemplo, he hecho que mi propiedad fuera una cadena de texto, pero puede ser de cualquier tipo de dato, y el formulario tendrá una entrada para ella. La mayoría de los tipos de datos tendrán de forma predeterminada una entrada de texto sin formato. Los booleanos tendrán una casilla de verificación. Si defines un DISPLAYLIST y un VALUELIST para la propiedad, como en el caso anterior, obtendrás un desplegable como alternativa, pero la primera opción debe estar en blanco o solo mostrará el cuadro de texto de forma predeterminada. Si la propiedad se marca como requerida, el indicador mostrará un * y el usuario no podrá continuar sin proporcionar un valor.

 

Ahora puedo crear una tarea que escriba "¡Sirve el café!" en un archivo de registro a las 9:00 AM y otra que escriba "¡Sirve el bourbon!" a las 5:00 PM añadiendo el mismo tipo de tarea al horario, pero con una opción diferente.


Mal servicio, 0 estrellas: Gestionando los fallos en las tareas

¡No tenía mi café esta mañana! ¿Qué ha pasado?

Hay un par de formas de comprobar el historial de tareas. Si seleccionas "Task History" (Historial de tareas) en el menú del Administrador de tareas del portal de administración, obtienes una lista cronológica y combinada con el historial de todas las tareas. Si vas a Task Schedule y haces clic en "History" (Historial), a la derecha de la tarea que te interesa, puedes ver el historial solo para esa tarea en particular. Allí podrás ver cualquier error.

También puedes ser más previsor y evitar las reseñas negativas en internet. Vuelve a tu Portal de administración y selecciona System Administration -> Additional Settings -> Task Manager Email. En esa sección puedes configurar los ajustes del correo electrónico de salida para recibir las notificaciones del Administrador de tareas. La configuración de SMTP está fuera del alcance de este artículo, pero deberías poder obtenerla de tu administrador de correo electrónico. Puedes fijar frases como asunto y mensajes tanto para el éxito como para el fracaso. No podrás crear un conjunto diferente de ajustes por tarea, pero en la parte inferior puedes ver una lista de variables que puedes incluir en tus correos electrónicos para proporcionar la información que necesitas. Los valores predeterminados proporcionan toda la información que normalmente se necesita.

Ahora, vamos a programar una tarea otra vez. En la parte inferior, aparecen los campos que no estaban antes si no se había configurado el SMTP. "Send completion email notification to" (Enviar notificación para completar la tarea) es donde se pone la dirección de correo electrónico a la que se enviará el mensaje cuando la tarea se complete correctamente. "Send error email notification to" (Enviar notificación de error por correo electrónico a) es donde se envía una notificación por correo electrónico cuando la tarea no se completa correctamente. Si eligió un archivo de salida, ese archivo también se adjuntará a las notificaciones por correo electrónico.

Vamos a hacer una pausa aquí para añadir claridad. Cuando manejemos esta configuración, "Error" significa que la tarea se ejecutó por completo, pero el método OnTask devolvió un estado de error. Todos los ajustes en la página de configuración de la tarea que se refieren al error o al éxito utilizan esa definición. Si el método OnTask devuelve un estado de error, se enviará el correo electrónico de notificación de error, y si "Suspend task on error?" (¿Suspender la tarea en caso de error?) se fijó en sí, la tarea se suspenderá hasta que le indiques que se reanude. Eso no se debe confundir con un error en el que un defecto en el método OnTask impidió que se completara. En ese tipo de error, no se enviarán notificaciones por correo electrónico y la tarea siempre se suspenderá. Debido a esto, ¡ten mucho cuidado con la forma de manejar los errores!

También hay una casilla desplegable para "Reschedule task after system restart?" (¿Reprogramar la tarea después de reiniciar el sistema?)" Esta opción determina cómo el sistema gestiona las tareas que debían ejecutarse, pero el sistema no funcionaba en ese momento. Si se establece en "No", la ejecución particular de la tarea solo se perderá y se reanudará de forma normal la siguiente vez que deba ejecutarse. Si se establece en "Sí" y la tarea se debería ejecutar mientras el sistema está inactivo, la tarea se ejecutará poco después de que el sistema se reinicie.


¡Pero es IMPORTANTE!: Esa opción que hemos ignorado

Prioridad Normal. Hazlo.

En realidad, eso es lo que querrás la gran mayoría de las veces. La Configuración Task Priority (Prioridad de Tareas) tiene que ver con la forma en que varios procesos compiten por los recursos de tu servidor cuando está ocupado, y rara vez querrás cambiarla. Si te preocupa tener la CPU con un porcentaje cercano al 99% todo el día y quieres que la tarea reciba una prioridad más alta o más baja que otras tareas que se llevan a cabo, puedes cambiar esta configuración para determinar cómo solucionar ese problema, pero humildemente te aviso que cambiar esta configuración no resuelve el verdadero problema.


¡Eso es todo! En este caso, mantuve mi método OnTask muy básico para mantener el foco en el uso real del administrador de tareas y la clase %SYS.Task.Definition, pero puedes poner lo que quieras allí. De este modo, podrás automatizar una gran cantidad de trabajo. Por ejemplo, en nuestros servidores, tenemos un servicio alojado en Tomcat que imprime, envía por correo electrónico y/o archiva Crystal Reports, y automatizamos un %Net.HttpRequest para llamar a ese proceso. Puedes programar cualquier cosa que puedas escribir en un método. Si se te ocurre alguna buena idea o tienes algún ejemplo, compártalo en los comentarios.

</body></html>