SharePoint 2007 : Tâches Planifiées et SPJobDefinition

Dans la plupart des cas, lorsque vous demandez à un développeur comment faire pour exécuter une tâche planifiée sur un serveur, il vous répondra que c'est possible via le planificateur de taches Windows ou avec un Service Windows, etc..

Dans l'environnement SharePoint, il existe une autre possibilité qui peut s'avérer bien plus pratique : les Timer Jobs ou SPJobDefinition. Si certains d'entres vous ne voient pas de quoi je parle, vous les avez sans doute entre-apercu sans le savoir dans votre site d'administration centrale.

Global Configuration

SharePoint utilise ce système pour gérer beaucoup de tâches internes comme la gestion des logs ou des statistique par exemple.

Job Definition

En pratique, il existe la possibilité de créer ses propres SPJobDefinition pour exécuter ses propres actions et de les activer/désactiver comme de simples features.

Voyons ensemble comment s'y prendre  (J'ai minimisé le pavé de code afin de le rendre le plus simple possible) :

Tout d'abord, il s'agit de créer une classe héritant de SPJobDefinition, de créer les constructeurs adéquats et d'overrider la methode Execute.

    public class JobListMailer : SPJobDefinition

    {

        public JobListMailer()

            : base()

        {

        }

        public JobListMailer(string jobName, SPService service, SPServer server, SPJobLockType targetType)

            : base(jobName, service, server, targetType)

        {

        }

       

        // J'ai utilisé ici quelques paramètres supplémentaires pour avoir un job facilement configurable via le property bag de la feature

        // Voir plus bas.

        public JobListMailer(string jobName, SPWebApplication webApplication, string urlSite, string urlWeb, string listName, string subject, string from, string to, int days)

            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)

        {

            this.Title = jobName;

            this.urlSiteCollection = urlSite;

            this.urlWebSite = urlWeb;

            // ...

        }

 

        public override void Execute(Guid targetInstanceId)

        {

            base.Execute(targetInstanceId);

 

            SPWebApplication webApp = this.Parent as SPWebApplication;

 

            SPContentDatabase contentDb = webApp.ContentDatabases[targetInstanceId];

 

            using (SPSite site = contentDb.Sites[urlSiteCollection])

            {

                using (SPWeb web = site.OpenWeb(urlWebSit))

                {

                  // Executer le code nécessaire : envoi de mail, copie de fichier système, etc ...

                }

            }

         }

    }

Pour déployer ce Job, il va falloir créer une deuxième classe héritant de SPFeatureReceiver qui va s'occuper de l'instanciation et de la configuration du job à l'activation et de la suppression de ce job et de toutes ces instances lors de la désactivation.

class FeatureEventReceiver : SPFeatureReceiver

{

    private const string STR_JobListMailer = "Job List Mailer";

 

    public override void FeatureActivated(SPFeatureReceiverProperties properties)

    {

        SPSite site = properties.Feature.Parent as SPSite;

 

        // On s'assure de bien supprimer toutes les instances du job avant d'en recréer une nouvelle.

        DeletePreviousJob(site);

 

        // On passe au constructeur, une série de paramètres provenant entre autres, du property bag de la feature

        JobListMailer job = new JobListMailer(STR_JobListMailer,

                                site.WebApplication,

                                site.Url,

                                properties.Definition.Properties["Web"].Value,

                                properties.Definition.Properties["ListName"].Value, // etc ...);

 

        // Il existe les equivalents en Daily et Weekly Schedule

        SPMinuteSchedule schedule = new SPMinuteSchedule();

 

        // Cette configuration du timer prévoit de le lancer toute les minutes

        schedule.BeginSecond = 0;

        schedule.EndSecond = 59;

        schedule.Interval = 1;

 

        job.Schedule = schedule;

 

        job.Update();

    }

 

    public override void FeatureDeactivating(SPFeatureReceiverProperties properties)

    {

        SPSite site = properties.Feature.Parent as SPSite;

        DeletePreviousJob(site);

    }

 

    private void DeletePreviousJob(SPSite site)

    {

        foreach (SPJobDefinition jobDefinition in site.WebApplication.JobDefinitions)

        {

            if (jobDefinition.Title == STR_JobListMailer)

                jobDefinition.Delete();

        }

    }

}

Pour finir, le fichier feature.xml qui permet le déploiement et le passage de paramètres via son property bag

<?xml version="1.0" encoding="utf-8" ?>

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"

        Id="05B65852-F56E-4A14-B2AB-7E43E83EB3FD"

        Title="Job List Mailer"

        Description="..."

        Scope="Site"

        Hidden="True"

        Version="1.0.0.0"

        ReceiverAssembly="Job List Mailer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e5fab36ae99af2c6"

        ReceiverClass="Job_List_Mailer.FeatureEventReceiver">

    <Properties>

        <Property Key="Web" Value="Northwind"/>

        <Property Key="ListName" Value="News"/>

        ...

    </Properties>

</Feature>

Pour installer et déployer tout ça, un petit coup de WSPBuilder.

Pour finir sur le déploiement, il est recommandé de créer les features qui installent les Jobs en Hidden="True". En effet, lorsqu'une feature est activée via l'interface Web, c'est via le pool d'application courant. Normalement (comprenez, dans une environnement de production sécurisé), ce pool d'application ne devrait pas avoir les droits suffisants pour appeler la procédure stockée nécessaire pour créer un SPJobDefinition. La solution est donc d'utiliser l'outil d'administration STSADM pour activer ce type de feature.

Pour finir, voilà quelques liens intéressants concernant les Jobs SharePoint :

<Philippe/>

Publié lundi 26 novembre 2007 07:00 par phil
Classé sous , , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: SharePoint 2007 : Tâches Planifiées et SPJobDefinition @ mercredi 16 juillet 2008 17:21

Bonnes explications, mais avec le code source sa serait vraiment mieux.

De plus que dans le code ci-dessus, il y a quelques erreurs.

guintolli

About phil

Philippe Sentenac est Consultant SharePoint à Wygwam en région Parisienne. Il intervient essentiellement sur des missions liées à SharePoint (2007 et 2010 ) mais aussi autour du Web 2.0. Plus généralement, il s'intéresse à l'ASP.Net (MVC) , à Silverlight, et à tout ce qui est orienté Web en rapport avec les nouvelles technologies, qu'il pratique depuis 2006. Féru de développement, il est passionné par les problématiques de méthodologies et d'industrialisation du développement.

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01