Comment puis-je obtenir une référence à un objet SPWeb spécifique dans un travail de minuteur personnalisé?

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/14815

  •  16-10-2019
  •  | 
  •  

Question

J'ai un travail de minuteur personnalisé qui importe des données provenant d'une source externe dans une liste spécifique sur un site Web spécifique dans mon installation SharePoint 2010. C'est le travail ne concerne que l'une liste sur une bande.

Je vais avoir un diable d'un temps obtenir une référence à ce Web (et donc la liste) dans ma classe SPJobDefinition.

Je pourrais hardcode le chemin du site et obtenir une nouvelle commande SPSite ( « de someurl »), mais je préfère le faire à partir du contexte du travail en quelque sorte il fonctionnera de façon transparente à travers mon dev, test de et les environnements de production.

J'ai essayé passer le GUID du site dans le SPEventreceiver que les horaires du travail, mais chaque fois que mon objet SPJobDefinition est créé, il semble utiliser le constructeur sans paramètre au lieu de celui que j'utilisé dans le gestionnaire de SPEventReciever.FeatureActivated.

Alors, ma question est la suivante:
Comment puis-je obtenir une référence à l'objet SPWeb (ou encore un objet SPSite) à partir de la méthode SPJobDefinition.Execute()?

Était-ce utile?

La solution

Je crois que vous avez créé le travail du minuteur Scoped Web Application. Sinon, vous pouvez le faire. Voir de référence (étape 2, balle n ° 7)

Et puis comme décrit à l'étape 2, point 10 balle dans le lien ci-dessus, vous pouvez écrire du code comme ceci:

public override void Execute(Guid targetInstanceId)
{
  // Execute the timer job logic.
  SPWebApplication webApp = this.Parent as SPWebApplication;
  SPList taskList = webApp.Sites[0].RootWeb.Lists["Tasks"];     
}

Mise à jour: En plus de cela, dans votre cas FeatureActivated, vous pouvez vérifier si la collection de sites (ou site) dans lequel la fonction est d'être Activate a la liste que le travail du minuteur va agir sur. Si oui, alors seulement créer une instance d'application Web travail du minuteur scope.

Autres conseils

Avoir un constructeur sur votre travail qui prend une url SPWeb ou une chaîne, puis stocker l'URL web et url liste et quelles que soient les autres propriétés que vous souhaitez comme une propriété persistante au travail.

Je recommande la création d'une fonction scope Web pour installer le travail du minuteur, et créer avec un nom qui a l'ID Web sur clouée (pour l'amour de l'unicité dans le cas où vous voulez que le travail sur plusieurs toiles). L'événement de fonction activée aurait le Web et toutes ses propriétés là pour pouvoir passer dans le constructeur de la tâche.

Voir mon blog pour plus d'informations sur exactement ceci: http://spmonkeypoint.wordpress.com/2011/11/14/custom- sharepoint-2010-timer-emploi

Voici le code annonce de ce poste:

using System;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace MonkeyPoints.TimerJobs
{
    [Guid("6DD003C3-2861-4F63-B974-D2653E713A74")]
    public class CustomTimerJob : SPJobDefinition
    {
        [Persisted]
        public string WebUrl;

        [Persisted]
        public string ListUrl;

        public CustomTimerJob() : base() { }

        public CustomTimerJob(SPWeb web, string listUrl) : this(JobName(web), web, listUrl) { }

        public CustomTimerJob(string jobName, SPWeb web, string listUrl)
            : base(jobName, web.Site.WebApplication, null, SPJobLockType.Job)
        {
            this.WebUrl = web.Url;
            this.ListUrl = listUrl;
        }

        protected static string JobName(SPWeb web)
        {
            return "CustomTimerJob_" + web.ID;
        }

        protected override bool HasAdditionalUpdateAccess()
        {
            return true;
        }

        public override void Execute(Guid targetInstanceId)
        {
            try
            {
                using (var site = new SPSite(WebUrl))
                using (var web = site.OpenWeb())
                {
                    // process whatever you need to on this list
                }
            }
            catch (Exception ex)
            {
                SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory(this.Name, TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
            }
        }

        public static void Install(SPWeb web, string listUrl, SPSchedule schedule)
        {
            using (SPSite site = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken))
            using (SPWeb eweb = site.OpenWeb(web.ID))
            {
                site.AllowUnsafeUpdates = true;
                eweb.AllowUnsafeUpdates = true;
                Uninstall(eweb);
                var syncJob = new CustomTimerJob(eweb, listUrl);
                syncJob.Schedule = schedule;
                syncJob.Update();
            }
        }

        public static void Uninstall(SPWeb web)
        {
            var jobName = JobName(web);
            foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions)
            {
                if (job.Name == jobName)
                    job.Delete();
            }
        }

        public static void RunNow(string webUrl, string listUrl)
        {
            using (SPSite site = new SPSite(webUrl))
            using (SPWeb web = site.OpenWeb())
            {
                var job = new CustomTimerJob(web, listUrl);
                job.Execute(Guid.Empty);
            }
        }
    }
}

Vous pouvez créer une page pour configurer un paramètre contre l'application Web, puis utilisez les paramètres de l'application Web pour contrôler le SPWeb utilisé.

Pour ce faire, vous déploierait une page d'application dans SharePoint. Vous souhaitez rendre disponible dans Central Admin (probablement à l'aide d'un contrôle de WebApplicationSelector choisir quelle application Web pour définir la valeur).

(La raison pour laquelle vous faites cela dans l'admin central est que la mise à jour les propriétés d'application Web nécessite un accès en écriture à la base de données de configuration - et vous pourriez n'avoir cela en administration centrale, selon votre configuration)

Ensuite, dans « Save » pour vous postback nouveau pour vous auriez quelque chose comme:

protected WebApplicationSelector _selector = ...

public void SaveIt() {
  SPWebAppliction webApp = _selector.CurrentItem;
  webApp.Properties["MyWeb"] = "SomeValue";
  webApp.Update();
}

Ensuite, dans le Job Timer vous devriez être en mesure d'accéder aux propriétés de l'application Web et lisez la valeur dont vous avez besoin.

Dans votre code timerjob vous pouvez itérer throught toutes les collections de sites dans l'application Web de contexte et vérifier l'existence d'un élément de sac de propriété personnalisée sur le rootweb (vous devrez ajouter vous-même) qui détient le (serveur relatif) URL à un SPWeb dans cette collection de sites.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top