GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

Cómo crear un Timer Job de SharePoint desde Visual Studio 2010


La creación de Timer Jobs en SharePoint es una potente herramienta para el desarrollo de aplicaciones personalizadas en SharePoint, gracias a los cuales, podemos ejecutar de forma desatendida y planificada el código que deseemos, y además, ejecutarlo fuera del IIS (interesante para código que pueda necesitar ejecuciones de larga duración). El presente artículo describe cómo crear un Timer Job de SharePoint 2010 paso a paso con Visual Studio 2010.

Un Timer Job es una tarea ejecutable que corre sobre uno o varios servidores de forma desatendida en base a una planificación, un concepto similar a los Jobs del Agente de SQL Server. Los Timer Jobs resultan de gran utilidad para descargar al IIS de las tareas de larga ejecución y de las tareas periódicas, que pasarán a ser gestionadas por el servicio SharePoint 2010 Timer. Existen multitud de Timer Jobs que vienen OOB con el propio producto, que varían en función de la edición de SharePoint que se trate, y adicionalmente, podemos desarrollar nosotros nuestros propios Timer Jobs, por lo que en consecuencia también podremos encontrar muchos Timer Jobs correspondientes a aplicaciones de terceros.

Cada Timer Job tiene un alcance (Scope), es decir, un tipo de objeto que indica a qué nivel jerárquico trabajará el Timer Job, existiendo tres posibilidades:

  • La Granja.
  • Un Servidor.
  • Una Base de Datos de Contenido.

Es decir, un Timer Job se ejecutará una vez por Granja, una vez por Servidor, ó una vez por Base de Datos de Contenido. De hecho, esto queda reflejado en los tres posibles valores de la enumeración SPJobLockType:

  • Job. El Job se ejecuta una vez por Granja. Un ejemplo sería el Job CEIP data collection job.
  • None. El Job se ejecuta una vez por Servidor. Cada servidor de la Granja tiene/posee (no se muy bien cómo describirlo) una Instancia del Job. Un ejemplo, sería el Config Refresh job.
  • Content Database. El Job se ejecuta una vez por Base de Datos de Contenido. Un par de ejemplos serían el Job de Immediate Alerts Jobs y el Job de Recycle Bin cleanup.

Para crear un Timer Job, deberemos crear una clase del tipo SPJobDefinition, la cual deberá tener un par de constructores, además de sobrescribir el método Execute(). Finalmente, necesitaremos una Característica (Feature), para a través de los Eventos de Activación y Desactivación de la misma (FeatureActivated y FeatureDeactivating) registrar y deregistrar nuestro Timer Job en la Granja de SharePoint sobre la que estemos desplegando nuestra Solución.

Creación de un Timer Job paso a paso con Visual Studio 2010

En el siguiente ejemplo, vamos a crear paso a paso un Timer Job que se ejecutará una vez por Granja (Scope Farm), utilizando Visual Studio 2010.

Crearemos un nuevo Proyecto en Visual Studio 2010 de tipo Empty SharePoint Project, asegurándonos de seleccionar el Net Framework 3.5 y asignaremos el nombre que deseemos para el Proyecto (en nuestro caso, lo llamaremos MyTimerJob). En el Wizard para la creación del Proyecto, seleccionaremos la opción Deploy as a farm solution.

Seguidamente crearemos una nueva clase pública (no olvidar añadir el modificador de acceso public) que herede de SPJobDefinition, para lo cual deberemos crear un par de constructores y sobrescribir el método Execute(), además de añadir al menos un par de sentencias using.

Seguidamente crearemos una nueva clase pública que herede de SPJobDefinition

De los dos constructores:

  • El constructor por defecto no lo modificaremos.
  • En el otro constructor, llamaremos al constructor base, pero deberemos especificar el nombre del Job (Title). También deberemos especificar el tipo de bloqueo del Job utilizando la enumeración SPJobLockType, lo cual está relacionado con el alcance (Scope) del propio Job (lo comentamos al principio de este artículo). En nuestro caso de ejemplo, como deseamos crear un Job para ejecutarse una vez por Granja, utilizaremos el tipo de bloqueo SPJobLockType.Job. Y por último, para el parámetro Server del constructor base, deberemos especificar una instancia de la clase SPServer si el Job tiene de alcance un Servidor (Scope Server) o null si el Job no está asociado a ningún Servidor (en nuestro caso especificaremos null).

Por otro lado, el método Execute() recibe como parámetro un objeto de tipo GUID, el cual, cuando el alcance (Scope) del Job es la Base de Datos de Contenido representará una referencia a la Base de Datos de Contenido sobre la que se está ejecutando la instancia actual del Job. En el resto de casos (como en el nuestro), será null. 

Despliegue del Timer Job

Una vez que ya hemos desarrollado la clase de nuestro Timer Job, tenemos que preparar su despliegue. Para ello, añadiremos una Característica (Feature) a nuestro Proyecto de Visual Studio 2010, la configuraremos con un alcance a nivel de Aplicación Web (Scope Web Application), y añadiremos un Event Receiver a nuestra Característica, donde incluiremos el código para el despliegue y eliminación de nuestro Timer Job (FeatureActivated y FeatureDeactivating).

Añadiremos una Característica (Feature) a nuestro Proyecto, sobre la que añadiremos un Event Receiver

A continuación podemos ver un código de ejemplo para la activación y desactivación de un Timer Job.

FeatureActivated y FeatureDeactivating

Despedida y Cierre

Hasta aquí llega el presente artículo, en el cual hemos intentado presentar la forma de desarrollar un Timer Job de SharePoint 2010 con Visual Studio 2010, una tarea que puede resultarnos de utilidad en multitud de ocasiones. Por último, antes de acabar, aprovecho para añadir algunos enlaces de interés, para quien desee ampliar más información:

 Poco más por hoy. Espero que la lectura resulte de interés.

 


Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.