domingo, 27 de junio de 2010

Aspectos a tomar en cuenta en el desarrollo de TimerJobs en SharePoint

Los timer jobs se instalan a nivel de Colección de Sitios, esto quiere decir que estará disponible para todos los sitios dentro de la colección de Sitios, esto quiere decir que debemos de planificar a nivel de colección de sitios la solución que estamos ejecutando dentro de nuestro timer job. 

El tema se complica cuando tenemos varias colecciones de sitios dentro de una misma aplicación Web.  Debemos de pensar que se ejecutará por cada una de ella si se activa.

Y ojo con la activación es necesario realizarla explícitamente ya se por código, por línea de comando o manualmente.  Muchas veces sucede que no podemos depurar el código o no nos funciona sencillamente porque se nos ha olvidado activarla.  El estado de los Timer Job en Operaciones del Central Administration solo nos indica si esta bien instalado y si no ha encontrado ningún error pero no nos dice si esta activada.

La cosa se complica un poco mas si tenemos sobre una misma Web Application dos colecciones de sitios una en diferente base de datos  deberíamos en nuestro código tomar en cuenta dicho escenario.

Extrañamente el InstanceID que trae el timer job no es de la colección de sitios donde se activó el timer job sino de la base de datos predeterminada por ello hay que hacer un hack para corregir el rumbo.

Con la siguiente línea obtenemos la instancia de la WebApplication que es necesaria ya que es un proceso que esta corriendo en el servidor dijéramos como un servicio y no desde el IIS.

SPWebApplication webApplication = this.Parent as SPWebApplication;

Luego obtenemos la colección de bases de datos de contenido y buscamos la deseada (esto es para el caso que una Web App tenga mas de una base de datos de contenido, sino no es necesario pero como saber la configuración donde instalaremos el time job.)image

Luego podemos obtener la colección de sitios y por ende el sitio deseado a través de los objetos SPSite (SiteCollection) y SPWeb (WebSite)

image

En este ejemplo podemos ver la importancia de conocer la jerarquía de objetos dentro de SharePoint para poder acceder los objetos deseados.

sharepoint object model hierarchy

Si deseas depurar un timer job Necesitas adjuntar el proceso OWSTimer.

image

Espero te sirva, Code4Fun!,

Manolo Herrera

No hay comentarios.: