Wie kann ich einen Verweis auf ein spezifisches SPWeb -Objekt in einem benutzerdefinierten Timer -Job erhalten?

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

  •  16-10-2019
  •  | 
  •  

Frage

Ich habe einen benutzerdefinierten Timer -Job, der Daten von einer externen Quelle in eine bestimmte Liste in einem bestimmten Web in meiner SharePoint 2010 -Installation importiert. Das ist der Job ist nur für eine Liste in einem Web relevant.

Ich habe einen Teufel einer Zeit, die einen Verweis auf dieses Web (und damit die Liste) in meiner SPJobDefinition Klasse.

Ich könnte den Pfad der Site hardcodieren und ihn mit einem neuen Befehl Sp -Site ("Someurl") bekommen, aber ich würde es vorziehen, ihn irgendwie aus dem Kontext des Jobs zu erhalten .

Ich habe versucht, die Site GUID in der zu verabschieden SPEventreceiver Das plant den Job, aber wann immer meine SPJobDefinition Objekt wird erstellt, es scheint zu sein, den Konstruktor ohne Parameter anstelle dessen zu verwenden, die ich in der verwendete SPEventReciever.FeatureActivated Handler.

Meine Frage ist also:
Wie kann ich einen Verweis auf das SPWEB -Objekt (oder alternativ ein Sp -Site -Objekt) von innerhalb des SPJobDefinition.Execute() Methode?

War es hilfreich?

Lösung

Ich glaube, Sie haben Webanwendungen mit Scoped Timer -Job erstellt. Wenn nicht, möchten Sie das vielleicht tun. Sehen Hinweis (Schritt 2, Kugel Nr. 7)

Und dann, wie in Schritt 2 beschrieben, Bullet Item 10 in Link oben, können Sie einen solchen Code schreiben:

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"];     
}

UPDATE: Darüber hinaus möchten Sie bei Ihrem Ereignis in Ihrem Ereignis überprüfen, ob die Site -Sammlung (oder die Website), in der die Funktion aktiviert wird, die Liste hat, auf die Timer -Job reagieren wird. Wenn ja, erstellen Sie nur eine Instanz des Timer -Jobs für Webanwendungen.

Andere Tipps

Haben Sie einen Konstruktor in Ihrem Job, der eine SPWeb- oder String -URL aufnimmt, und speichern Sie dann die Web -URL und listen Sie die URL und alle anderen Eigenschaften auf, die Sie als anhaltende Eigenschaft für den Job wünschen.

Ich empfehle, eine Web-Scoped-Funktion zu erstellen, um den Timer-Job zu installieren und sie mit einem Namen zu erstellen, in dem die Web-ID angeht (um den Auftrag auf mehreren Websachen zu senken). Das aktivierte Ereignis für die Funktion des Funktions, das das Web und alle Eigenschaften genau dort haben, um den Konstruktor des Jobs übergeben zu können.

Weitere Informationen dazu finden Sie in meinem Blog -Beitrag:http://spmonkeypoint.wordpress.com/2011/11/14/custom-sharepoint-2010-timer-job

Hier ist die Codeauflistung aus diesem Beitrag:

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);
            }
        }
    }
}

Sie können eine Seite zum Konfigurieren einer Einstellung für die Webanwendung erstellen und dann die Web -App -Einstellungen zur Steuerung des verwendeten SPWEB verwenden.

Dazu würden Sie eine Anwendungsseite in SharePoint bereitstellen. Sie würden dies in Central Admin verfügbar machen (wahrscheinlich verwenden Sie eine Webanapplications -Auswahlsteuerung, um auszuwählen, für welche Web -App den Wert festgelegt wird).

(Der Grund, warum Sie dies im zentralen Administrator tun, ist, dass die Aktualisierung der Eigenschaften der Webanwendung Schreibzugriff auf die Konfigurationsdatenbank erfordert - und Sie haben dies möglicherweise nur in Central Admin, abhängig von Ihrer Konfiguration.)

Dann in "Save" -Postback für Sie neu für Sie hätten so etwas wie:

protected WebApplicationSelector _selector = ...

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

Im Timer -Job sollten Sie dann in der Lage sein, auf die Eigenschaften der Webanwendung zugreifen und den von Ihnen benötigten Wert lesen können.

In Ihrem Timerjob -Code können Sie alle Site -Kollektionen in der Kontext -Web -App durchtieren und nach der Existenz eines benutzerdefinierten Eigenschaftssackelements auf dem RootWeb (Sie müssen dies selbst hinzufügen), der die (Server) URL zu einem SPWEB hält in dieser Site -Sammlung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top