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.)
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)
En este ejemplo podemos ver la importancia de conocer la jerarquía de objetos dentro de SharePoint para poder acceder los objetos deseados.
Si deseas depurar un timer job Necesitas adjuntar el proceso OWSTimer.
Espero te sirva, Code4Fun!,
Manolo Herrera
No hay comentarios.:
Publicar un comentario