Rodrigo Romano – MVP SharePoint Server

Registros de um Especialista SharePoint :)

Posts Tagged ‘Timer Jobs

Regular TimerJob e Work Item TimerJobs

leave a comment »


Olá SharePointers,

Com o natal chegando, festas, fim de ano e toda a correria já esperada do final de ano, vou fazer provavelmente o meu último post desse ano.

Em uma discussão no grupo de SharePointers dentro do Facebook (https://www.facebook.com/groups/sharepointers/) uma das sugestões – de um amigo Reynaldo Souza – foi falar sobre a diferença de Regular Timer Job e Work Item Timer Jobs.

Já fiz, no passado, um post falando sobre TimerJobs Criando Custom Timer Jobs no SharePoint.

Resumidamente, TimerJob é uma forma de realizar atividades em “lote”, de forma agendada, baseada em alguma recorrência. Como o processo não roda através do IIS (w3wp), não existe os problemas comuns de Timeout de operações que temos ao executar operações longas.

A grande diferença do Work Item TimerJob em relação ao TimerJob normal, é que elé já contém uma infraestrutura prevista para o processamento de itens em lote, inclusive inclui até mesmo a funcionalidade de Pausa durante o processamento (Fantástico!).

 

O que muita gente não sabe é que esse tipo de TimerJob já estava presente desde a versão 2007 do SharePoint (WSS 3.0) e ele é a maneira “correta” do SharePoint processar itens em lote sem gerar trabalhos adicionais para os desenvolvedores… (Adoro essa plataforma!)

Sendo assim, o foco do desenvolvedor é apenas processar o item e não gerar um mecanismo de fila de processamento, com listas adicionais e seja lá mais for necessário para a sua regra de negócio.

Abaixo, segue alguma referências de blogs que dão mais detalhes sobre o assunto e até mostram como criar e utilizar esse recurso:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spworkitemjobdefinition.aspx

http://blogs.technet.com/b/stefan_gossner/archive/2011/11/17/sharepoint-variations-the-complete-guide-part-4-timer-jobs.aspx

http://blog.mastykarz.nl/processing-items-work-item-timer-jobs-sharepoint-2010/

 

Pessoal, feliz natal e um ótimo ano novo a todos! Smiley de boca aberta

Abraços!

Written by Rodrigo Romano

December 23, 2013 at 10:46 am

SharePoint 2010 – Access Denied ao Ativar uma Feature de Timer Job

with 2 comments


 

Olá SharePointers,

Este post é para ajudar váaaaaarios SharePointers que tentaram fazer um Custom Timer Job, exatamente da mesma maneira que faziam no 2007 e, na hora de atualizar: ERRO!

“The SPPersistedObject, Microsoft.SharePoint.Administration.SPJobDefinition, could not be updated because the current user is not a Farm Administrator”.

A primeira reação seria: vamos rodar com privilégios elevados: SPSecurity.RunWithElevatedPrivileges() – mas, não funciona também.

Depois de estudar e procurar várias referências na internet, descobri a causa do problema:

Na dll Microsoft.SharePoint.dll foi introduzido um recurso de segurança a todos os objetos que herdam de SPPersistedObject no namespace Microsoft.SharePoint.Administration.

Basicamente, esse recurso BLOQUEIA qualquer alteração nesses objetos originados de uma Web Application.

Para tal finalidade, foi criada uma propriedade na API do SharePoint 2010 para controlar esses recursos de segurança:

Microsoft.SharePoint.Administration.SPWebService.ContentService.RemoteAdministratorAccessDenied

Conclusão, ao setarmos a propriedade acima com FALSE, o código funcionará perfeitamente.

Segue o link do PowerShell Scriptlet para realizar tal mudança: Download PowerShell Script

 

Abraços!!

Written by Rodrigo Romano

November 19, 2010 at 12:29 pm

Criando Custom Timer Jobs no SharePoint

with 2 comments


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

Written by Rodrigo Romano

October 21, 2010 at 11:53 pm

Posted in SharePoint

Tagged with ,