Criando Custom Timer Jobs no SharePoint

Overview

Timer Job é uma tarefa a ser executada com definições de agendamento.

O que isso quer dizer?

Vejamos: Em qualquer aplicação surge a necessidade de realizar algumas tarefas de forma agendada e de forma repetida: Mandar e-mails para os aniversariantes do mês, por exemplo – Todo mês devemos realizar a mesma tarefa, ou seja, mandar e-mails. Vimos que tanto a tarefa (mandar e-mails) quanto a periodicidade (mensal) está definida.

Bom, sabemos que o SharePoint também fornece este recurso, mas como funciona isso internamente?

Solução

Quando você instala o SharePoint, um de seus componentes que são instalados é o serviço do Windows: SharePoint Timer (SPTimerV4 – SharePoint 2010 / SPTimerV3 – SharePoint 2007).

Este serviço é responsável por atividades, como mandar e-mails, processar os alertas, limpar a lixeira entre outros. Veja: http://technet.microsoft.com/en-us/library/cc678870.aspx.

Nota: O serviço SPTimerV4 se baseia no calendário gregoriano para agendamento. Para cada job que você agendar, você deve especificar quando o job deverá rodar em um formato de 24 horas. Você deve especificar o horário no formato local ao invés de um offset do UTC. Além disso, você pode especificar Timer Jobs utilizando o PowerShell: Cmdlets de Timer Job (SharePoint Server 2010).

Para uma lista dos Timer Jobs default, veja: http://technet.microsoft.com/pt-br/library/cc678870.aspx#DefaultJobs.

Bom, agora que entendemos como o SharePoint trata internamente os Timer Jobs, vamos ao que interessa.

Para os desenvolvedores, o que precisamos saber de Timer Job é que você precisa criar uma classe que herde de Microsoft.SharePoint.Administration.SPJobDefinition. Depois, você deve pegar o seu assembly e fazer o delpoy no GAC e aí sim instalá-lo na Farm SharePoint.

De acordo com a SDK do SharePoint, a classe SPJobDefinition possui 3 construtores. O construtor sem parâmetros é reservado para uso interno. Os outros dois construtores servem para definir o nome do Timer Job, a Web Application ou o Serviço que está rodando e o tipo de trava. A trava faz com que múltiplos timer Jobs não rodem simultaneamente.

Existem 3 formas de travas, definidos no enumerator SPJobLockType:

  • SPJobLockType.ContentDatabase   Trava o Banco de dados de conteúdo. O Timer só pode rodar uma vez no banco de dados de conteúdo da aplicação.
  • SPJobLockType.Job   Trava o job para rodar somente em uma máquina da farm.
  • SPJobLockType.None   Sem travas. Roda em todas as máquinas.

Exemplo, criar um Timer Job para fazer o log de tarefas.

Code Snippet
  1. namespace CanalSharePoint.TaskLogger
  2. {
  3.  
  4.     public class TaskLoggerJob : SPJobDefinition
  5.     {
  6.  
  7.         public TaskLoggerJob()
  8.             : base()
  9.         {
  10.  
  11.         }
  12.  
  13.         public TaskLoggerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType)
  14.  
  15.             : base(jobName, service, server, targetType)
  16.         {
  17.  
  18.         }
  19.  
  20.         public TaskLoggerJob(string jobName, SPWebApplication webApplication)
  21.  
  22.             : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
  23.         {
  24.             this.Title = "CanalSharePoint – Task Logger";
  25.         }
  26.  
  27.  
  28.  
  29.         public override void Execute(Guid contentDbId) {
  30.   
  31.           // get a reference to the current site collection's content database
  32.           SPWebApplication webApplication = this.Parent as SPWebApplication;
  33.           SPContentDatabase contentDb webApplication.ContentDatabases[contentDbId];
  34.   
  35.           // get a reference to the "Tasks" list in the RootWeb of the first site collection in the content database
  36.           SPList taskList = contentDb.Sites[0].RootWeb.Lists["Tasks"];
  37.   
  38.  
  39.           // create a new task, set the Title to the current day/time, and update the item
  40.           SPListItem newTask = taskList.Items.Add();
  41.           newTask["Title"] = DateTime.Now.ToString();
  42.           newTask.Update();
  43.   
  44.         }
  45.  
  46.     }
  47.  
  48. }

Após isso, devemos criar um installer para a Feature, veja:

Code Snippet
  1.     namespace CanalSharePoint.TaskLogger {
  2.   
  3.       class TaskLoggerJobInstaller : SPFeatureReceiver {
  4.         const string TASK_LOGGER_JOB_NAME = "CanalSharePoint – TaskLogger";
  5.         public override void FeatureInstalled (SPFeatureReceiverProperties properties) {
  6.         }
  7.   
  8.         public override void FeatureUninstalling (SPFeatureReceiverProperties properties)
  9.         }
  10.   
  11.         public override void FeatureActivated (SPFeatureReceiverProperties properties) {
  12.           SPSite site = properties.Feature.Parent as SPSite;
  13.           // make sure the job isn't already registered
  14.           foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) {
  15.             if (job.Name == TASK_LOGGER_JOB_NAME)
  16.               job.Delete();
  17.           }
  18.   
  19.       
  20.   
  21.           // install the job
  22.           TaskLoggerJob taskLoggerJob = new TaskLoggerJob(TASK_LOGGER_JOB_NAME, site.WebApplication);
  23.           // interval of the Job. Runs Every 5 mins.
  24.           SPMinuteSchedule schedule = new SPMinuteSchedule();
  25.           schedule.BeginSecond = 0;
  26.           schedule.EndSecond = 59;
  27.           schedule.Interval = 5;
  28.           taskLoggerJob.Schedule = schedule;
  29.   
  30.           taskLoggerJob.Update();
  31.         }
  32.   
  33.         public override void FeatureDeactivating (SPFeatureReceiverProperties properties) {
  34.           SPSite site = properties.Feature.Parent as SPSite;
  35.           // delete the job
  36.           foreach (SPJobDefinition job in site.WebApplication.JobDefinitions) {
  37.             if (job.Name == TASK_LOGGER_JOB_NAME)
  38.               job.Delete();
  39.           }
  40.   
  41.         }
  42.   
  43.       }
  44. }

 

E pronto! Agora só criar o WSP e fazer o deploy!

Conclusão

Com este artigo aprendemos a criar um Custom Timer Job e a entender um pouco mais sobre esta ferramenta fantástica que é muito útil para os desenvolvedores.

Outras Referências

http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx

http://msdn.microsoft.com/en-us/library/cc406686(office.12).aspx

2 ideias sobre “Criando Custom Timer Jobs no SharePoint

  1. Daniel

    Então ele continua me dando esse ERRO
    Error occurred in deployment step ‘Activate Features’: Feature with Id ‘7a210cab-2753-4546-97b1-71c043542474’ is not installed in this farm, and cannot be added to this scope.
    Daniel M.

    Responder
  2. Pingback: Regular TimerJob e Work Item TimerJobs | Rodrigo Romano - Especialista SharePoint

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *