miércoles, 9 de junio de 2010

Hoy va de Jobs...de SPJobs!!

Estos días en Raona he tenido la necesidad de tener que crear "algo" que se ejecute cada cierto tiempo para comprobar cierta información de una lista y enviar mails según si se cumplen unas condiciones en dicha lista.

Buscando y sobretodo ayudado por mis compañeros, descubrí los SPJobDefinition, como sabéis Job = trabajo. Un SPJobDefinition es un programa integrado en Sharepoint que se ejecuta cada cierto tiempo.

La manera por la cual aprendí a implementarlos y lo que es más importante, instalarlos, es la siguiente:

1.- Crear un SPJobDefinition (os pongo un ejemplo, y os explico):


namespace Test.TaskLogger {
public class TaskLoggerJob : SPJobDefinition{

public TaskLoggerJob ()
: base(){
}

public TaskLoggerJob (string jobName, SPService service, SPServer server, SPJobLockType targetType)
: base (jobName, service, server, targetType) {
}

public TaskLoggerJob (string jobName, SPWebApplication webApplication)
: base (jobName, webApplication, null, SPJobLockType.ContentDatabase) {
this.Title = "Task Logger";
}

public override void Execute (Guid contentDbId) {
// get a reference to the current site collection's content database
SPWebApplication webApplication = this.Parent as SPWebApplication;
SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];

// get a reference to the "Tasks" list in the RootWeb of the first site collection in the content database
SPList taskList = contentDb.Sites[0].RootWeb.Lists["Tasks"];

// create a new task, set the Title to the current day/time, and update the item
SPListItem newTask = taskList.Items.Add();
newTask["Title"] = DateTime.Now.ToString();
newTask.Update();
}
}
}


Un SPJobDefinition tiene varias funciones importantes definidas pero la que nos importa es la función Execute. Dentro de la función Execute escribiremos el código que queremos que se ejecute (valga la redundancia) cada vez que el job se lance.


2.- Crear una Feature que se encargue de activar ese job (os pongo aquí un ejemplo y os explico):


namespace Test.TaskLogger {
class TaskLoggerJobInstaller : SPFeatureReceiver {
const string TASK_LOGGER_JOB_NAME = "TaskLogger";
public override void FeatureInstalled (SPFeatureReceiverProperties properties) {
}

public override void FeatureUninstalling (SPFeatureReceiverProperties properties) {
}

public override void FeatureActivated (SPFeatureReceiverProperties properties) {
SPSite site = properties.Feature.Parent as SPSite;

// make sure the job isn't already registered
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) {
if (job.Name == TASK_LOGGER_JOB_NAME)
job.Delete();
}

// install the job
TaskLoggerJob taskLoggerJob = new TaskLoggerJob(TASK_LOGGER_JOB_NAME, site.WebApplication);

SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 5;
taskLoggerJob.Schedule = schedule;

taskLoggerJob.Update();
}

public override void FeatureDeactivating (SPFeatureReceiverProperties properties) {
SPSite site = properties.Feature.Parent as SPSite;

// delete the job
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) {
if (job.Name == TASK_LOGGER_JOB_NAME)
job.Delete();
}
}
}
}

En nuestro caso, la función que nos interesa de la feature que activa el Job es la FeatureActivated. Si nos fijamos lo primero que hace es buscar que no tengamos ya un Job definido con el mismo nombre, para no duplicar y que hubieran problemas.

3.- Lo siguiente es crear un nuevo job con las variables que necesita el constructor de ese Job.

4.- Luego tenemos que definir con que frecuencia ese job será ejecutado en el sistema. En este ejemplo se ejecuta cada minuto, por eso la definición de:

SPMinuteSchedule schedule = new SPMinuteSchedule();

las otras opciones son:

SPDailySchedule (cada día)
SPMonthlySchedule (cada mes)
SPHourlySchedule (cada hora)

(Buscar información sobre estas características ya que cada una tiene su propia definición de horario de ejecución, por ejemplo, SPDailySchedule tienes que definir una hora de empiece y otra de fin para que se ejecute durante el día).

5.- Por último para activar la feature coger un xml de cualquier otra feature (disponibles en el directorio 12 de Sharepoint, directorio TEMPLATE/FEATURES, (cada carpeta es una feature)) y adecuar el xml de cualquiera a nuestra feature.
Y ahora si, por últimisimo tenemos que instalar y activar la feature, a la vez que la feature nos activará el job (podréis ver que lo tenéis ya instalado en la "Central Administration" de SP en los Jobs Definitions.

5.b.- Para instalar la feature:

http://technet.microsoft.com/en-us/library/cc263123(office.12).aspx

Para activar la feature:

http://technet.microsoft.com/es-es/library/cc262692(office.12).aspx

Suerte y a por ello!!!

No hay comentarios:

Publicar un comentario