¿Cómo crear un custom job para una colección de sitios en particular en SharePoint con C#?

En este artículo veremos como crear un job personalizado en SharePoint que sea específico de una colección de sitios. Esto lo haremos sin "hardcodear" la URL ni almacenarla en alguna opción de configuración.

 
Para ello seguimos los siguientes lineamientos:
  • Creamos una feature de scope SITE
  • Guardamos la URL de la colección del sitio en forma dinámica en el momento de crear el job
  • Leemos la URL guardada en el momento de ejecutar el job
 
Paso 1: feature


Creamos una feature de scope SITE.
 
 
Y agregamos eventos para activarla y desactivarla
 
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Administration;

namespace EMP_Procesos.Features.EMP_Alarmas
{

    [Guid("blabla")]
    public class EMP_AlarmasEventReceiver : SPFeatureReceiver
    {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPSite sitio = properties.Feature.Parent as SPSite;
                SPWebApplication webApp = sitio.WebApplication;
                EMPJobs.alarmasJobAdm.borrarJobAlarmas(webApp.JobDefinitions);
                EMPJobs.alarmasJobAdm.crearJobAlarmas(webApp, sitio.Url);
            });

        }
        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPSite sitio = properties.Feature.Parent as SPSite;
                SPWebApplication webApp = sitio.WebApplication;
                EMPJobs.alarmasJobAdm.borrarJobAlarmas(webApp.JobDefinitions);
            });
        }
    }
}

 
 
Paso 2: Creación del job


Desde la feature se llama a las funciones que crean y borran el job. Fíjense en particular que la función que crea el job almacena la propiedad con la URL del site collection:
 
    public class EMPJobs
    {

        // Lógica del JOB


        // Administración del JOB

        public static class alarmasJobAdm
        {

            public static void crearJobAlarmas(SPWebApplication webApp, string url)
            {
                EMPJobs.alarmasJob alarmasTimerJob = new EMPJobs.alarmasJob(webApp);

                // Guardo la URL del site collection como propiedad
                if (alarmasTimerJob.Properties.ContainsKey("sitioJobUrl"))
                    alarmasTimerJob.Properties.Remove("sitioJobUrl");
                alarmasTimerJob.Properties.Add("sitioJobUrl", url);

                // Schedule
                SPMinuteSchedule schedule = new SPMinuteSchedule();
                schedule.BeginSecond = 0;
                schedule.Interval = 30;
                alarmasTimerJob.Schedule = schedule;

                alarmasTimerJob.Update();
            }

            public static void borrarJobAlarmas(SPJobDefinitionCollection jobs)
            {
                foreach (SPJobDefinition job in jobs)
                    if (job.Name.Equals(EMPJobs.alarmasJob.nombreJob, StringComparison.OrdinalIgnoreCase))
                        job.Delete();
            }
        }

    }

 

Paso 3: Ejecución del job


    public class EMPJobs
    {

        // Lógica del JOB

        public class alarmasJob : SPJobDefinition
        {
            public const string nombreJob = "SURPOINT_Alarmas";
           
            public alarmasJob() : base() { }
           
            public alarmasJob(SPWebApplication webApplication) : base(nombreJob, webApplication, null, SPJobLockType.Job)
            {
                this.Title = "SURPOINT – Sistema de alarmas";
            }
           
            public override void Execute(Guid targetInstanceId)
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite miSitio = new SPSite(this.Properties["sitioJobUrl"].ToString()))
                    {
                        using (SPWeb miWeb = miSitio.OpenWeb())
                        {
                            // El procesamiento de nuestro job
                            // El procesamiento de nuestro job
                            // El procesamiento de nuestro job
                            // El procesamiento de nuestro job
                        }

                    }
                });
            }
        }

        // Administración del JOB

    }

 
El resultado


 
Algunos puntos a tener en cuenta:
  • El usuario que activa la feature debe tener permisos para crear jobs
  • El usuario que desactiva la feature debe tener permisos para borrar jobs
  • Es posible que se requiera reiniciar el Time job luego de hacer un despliegue para que el job tome la siguiente versión del código.
 
 
Bibliográfica:

Deja un comentario

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