domingo, 21 de julio de 2013

SharePoint 2010 - Crear un Timer Job

SharePoint 2010 - Crear un Timer Job

Vamos a explicar cómo crear un Timer Job para SharePoint 2010. Un Timer Job es un proceso el cuál corre en background y es lanzado cada cierta frecuencia de tiempo de igual manera que los servicios Windows.

Los Timer Jobs son manejados a través de un servicio de Windows llamadoSharePoint 2010 Timer, el cuál por defecto esta iniciado.



SharePoint 2010 dispone por defecto de bastantes Timer Jobs. Para una completa descripción de estos Timer Jobs visitad el siguiente enlace de la MSDN:

Timer Job reference

Ahora vamos a explicar cómo crear nuestro Timer Job. En el ejemplo vamos a crear un Timer Job el cuál cada 5 minutos minuto va a escribir un registro en la lista de Tareas.

Lo primero que debemos de hacer es abrir Visual Studio 2010 y crear un Proyecto vacío de SharePoint.

En la pantalla de qué tipo de solución crear elegimos la opción Implementar como solución de granja de servidores.

Una vez creado el proyecto agregamos una clase que será la definición de nuestro Timer Job. Esta clase debe heredar de la clase SPJobDefinitionubicada en el espacio de nombres Microsoft.Sharepoint.Administration. 

Code:
using Microsoft.SharePoint.Administration;

namespace JobDefinitionExample
{
    /// <summary>
    /// Heredamos de la clase SPJobDefinition
    /// </summary>
    public class JobDefinitionExample1 : SPJobDefinition


Agregamos 2 constructores a la clase. El primero sin parámetros y el segundo con parámetros que será el cuál usaremos.

Code:
 public JobDefinitionExample1()
            : base()
        {

        }

        public JobDefinitionExample1(string jobName, SPWebApplication webApplication)
            : base(jobName, webApplication, SPServer.Local, SPJobLockType.Job)
        {
 
                this.Title = "Timer job de ejemplo";
        }


Después debemos redefinir el método Execute que es donde deberemos incluir nuestra lógica, en nuestro caso escribir un registro en la lista de Tareas.

Code:
 //Sobreescribimos método Execute el cuál contiene la lógica del job.
        public override void Execute(Guid targetInstanceId)
        {
            
            //Obtenemos la referencia a la aplicación web

            SPWebApplication webApp = this.Parent as SPWebApplication;

            //Obtenemos referencia al sitio principal de nuestra colección de sitios
            SPWeb web = webApp.Sites[0].RootWeb;

            //Obtenemos una referencia a nuestra lista tareas
            SPList taskList = web.Lists.TryGetList("Tareas");

            //Creamos un nuevo registro en la lista
            SPListItem item = taskList.AddItem();

            item["Title"] = string.Format("Timer job de ejemplo paso a las {0}", DateTime.Now);

            //Persistimos en la BD de contenido
            item.Update();

        }


El siguiente paso es crearnos una característica cuyo ámbito debe serWebApplication, es decir la caraterística estará activada para todos los sitios de la aplicación web. Para cambiar el ámbito pulsar dos veces sobre el nombre de la característica y nos aparecerá la ventana de propiedades.



Una vez cambiado el ámbito a la característica le agregamos un receptor de eventos. Lo que vamos a hacer es al activar la característica instalar el Timer Job y al desactivarla eliminar el Timer Job.

El código a incluir en el método FeatureActivated para instalar el Timer Job sería el siguiente:

Code:
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {

            //Obtenemos una referencia al web application
            var webApp = properties.Feature.Parent as SPWebApplication;

            //Recorremos todos los Timer Job del web application
            foreach (var jobDefinition in webApp.JobDefinitions)
            {
                //Si nuestro Timer Job existe lo borramos
                if (jobDefinition.Name == JobName) jobDefinition.Delete();
            }

           //Instanciamos nuestra definición de Timer Job
            var listLoggerJob = new JobDefinitionExample1(JobName, webApp);


            //Definimos la opciones de inicio del Timer Job
            var schedule = new SPMinuteSchedule();

            schedule.BeginSecond = 0;
 
            schedule.EndSecond = 59;

            //Cada cuanto debe ejecutarse el TimeJob.
            //En este caso cada 5 minutos
            schedule.Interval = 5;
 
            listLoggerJob.Schedule = schedule;

            listLoggerJob.Update();

        }


Respecto cada cuanto está programado que se ejecute el Timer Job decir que en el ejemplo decimos que se debe ejecutar cada 5 minutos, por ello usamos la claseSPMinuteSchedule.

La cuestión es que podemos hacer que el Timer Job se ejecute en otro espacio de tiempo, por lo cual debemos usar otras clases diferentes a SPMinuteSchedule.

Todas las clases de las que disponemos son:

Clase SPOneTimeSchedule: Ejecuta el Timer Job en un rango de tiempo especificado. Referencia

Clase SPMinuteSchedule: Ejecuta el Timer Job en un número determinado de minutos (cada minuto o cada 200 minutos por ejemplo). Referencia

Clase SPHourlySchedule: Ejecuta el Timer Job cada hora. Referencia

Clase SPDailySchedule: Ejecuta el Timer Job diariamente. Referencia

Clase SPWeeklySchedule: Ejecuta el Timer Job semanalmente. Referencia

Clase SPMonthlySchedule: Ejecuta el Timer Job mensualmente. Referencia

Clase SPYearlySchedule: Ejecuta el Timer Job una vez al año. Referencia

El código a incluir en el método FeatureDeactivating para desinstalarlo sería:

Code:
      public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            //Obtenemos una referencia al web application
            var webApp = properties.Feature.Parent as SPWebApplication;

            //Recorremos todos los Timer Job del web application
            foreach (var jobDefinition in webApp.JobDefinitions)
            {
                //Si nuestro Timer Job existe lo borramos
                if (jobDefinition.Name == JobName) jobDefinition.Delete();
            }


        }


Una vez hecho esto ya solo queda activar la característica.

Para comprobar que el Timer Job está funcionando iríamos a la Administración Central de SharePoint > Supervisión > Trabajos del temporizador > Revisar definiciones de trabajo. Una vez dentro buscamos dentro de la lista nuestro Timer Job.

No hay comentarios:

Publicar un comentario