-
Sharepoint Jobs als Feature deployen
Veröffentlicht am 16. November, 2011 in den Kategorien ClipboardRegelmäßig wiederkehrende Aufgaben wie zum Beispiel das tägliche Überprüfen von Werten in einer Liste oder das löschen alter Einträgen, lassen sich in SharePoint am besten mit sogenannten “Jobs” realisieren. Wie man einen Job erstellt und als Feature deployt soll in diesem Artikel erklärt werden.
Der Job
Um einen Job zu erstellen, muss einem SharePoint Projekt zunächst eine neue Klasse hinzugefügt werden, welche von SPJobDefinition abgeleitet wird. Der Einfachheit halber sollte die Klassen wie im unten gezeigten Beispiel gestaltet werden.
class ContractReminder : SPJobDefinition { public ContractReminder() : base() { } public ContractReminder(String jobName, SPService service, SPServer server, SPJobLockType targetType) : base(jobName, service, server, targetType) { } public ContractReminder(String jobName, SPWebApplication webApplication) : base(jobName, webApplication, null, SPJobLockType.None) { this.Title = jobName; } public override void Execute(Guid targetInstanceId) { //Eigener Code //Erreichen von Properties aus der Featureaktivierung this.Properties["namedProperty"] } }Die Methode Execute() wird nach der Instantiierung des Jobs durch SharePoint aufgerufen, weshalb hier die Logik für den Job implementiert wird.
Das Feature
Als nächstes fügen wir dem Projekt ein neues Feature hinzu, welches den Job in SharePoint beim Aktivieren hinzufügt und entfernt wenn es deaktiviert wird. Im Beispielcode wird von einem Web-Scoped Feature ausgegangen. Zusätzlich wird dem Job die Web-Url als Property mitgegeben um später leichter auf das entsprechende Web innerhalb des Jobs zugreifen zu können. Dabei sollten nur Objekte angeben werden, die sich serialisieren lassen.
public class ExpirationReminderEventReceiver : SPFeatureReceiver { public override void FeatureActivated(SPFeatureReceiverProperties properties) { SPWeb web = properties.Feature.Parent as SPWeb; if (web == null) { throw new SPException("Error obtaining reference to SPWeb"); } SPWebApplication webApp = web.Site.WebApplication; if (webApp == null) { throw new SPException("Error obtaining reference to WebApplication"); } foreach (SPJobDefinition job in webApp.JobDefinitions) { if (job.Name.Equals("MyFeatureActivatedJob")) { job.Delete(); } } ContractReminder contractReminder = new ContractReminder("MyFeatureActivatedJob", webApp); contractReminder.Properties.Add("site", web.Url); SPDailySchedule schedule = new SPDailySchedule(); schedule.BeginHour = 1; schedule.BeginMinute = 0; schedule.BeginSecond = 0; contractReminder.Schedule = schedule; contractReminder.Update(); } public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { SPWeb web = properties.Feature.Parent as SPWeb; SPWebApplication webApp = web.Site.WebApplication; if (webApp == null) { throw new SPException("Error obtaining reference to Web application"); } foreach (SPJobDefinition job in webApp.JobDefinitions) { if (job.Name.Equals("MyFeatureActivatedJob")) { job.Delete(); } } } }Wichtig ist dabei zu beachten, dass auch beim Aktivieren versucht wird den alten Job zu löschen, damit dieser nicht mehrfach registriert wird und dementsprechend oft läuft. SharePoint unterscheidet die Jobs nicht am Namen.
Die Häufigkeit, mit welcher der Job laufen soll, kann über den Schedule festgelegt werden. Es stehen dabei Klassen von minütlich bis jährlich zur Verfügung. Man sollte sich nicht durch die Property-Bezeichnungen wie StartHour und EndHouer verwirren lassen. Diese legen nicht die Dauer des Jobs, sondern den Zeitraum fest, in welchem der Job ausgeführt werden kann.
Testen und Debuggen
Nachdem das Feature aus VisualStudio heraus deployt wurde, muss zuerst der SharePoint Timer-Dienst neu gestartet werden, damit dieser mit der aktuellen Version des gerade eben aktualisierten Assemblys arbeitet. Anschließend muss man sich mit VisualStudio an den Prozess “OWSTIMER” hängen und warten, dass der Job los läuft. Deshalb ist es ratsam, beim Debuggen den Job über die Zentral-Administration zu starten. Unter dem Punkt “Monitoring” > “Check job status” lassen sich alle Jobs einsehen und in der Detailansicht über “Run Now” sofort ausführen.
Deployment
Zuletzt sollte das Feature in den entsprechenden Template.xml noch als “Hidden” markiert werden, damit es nicht unter den Site-Features auftaucht, da es sich von dort aus nicht (de)aktvieren lässt. Jobs lassen sich aus Sicherheitsgründen nur durch den Farm-Administrator verwalten; Aktionen über die Web-Oberfläche laufen jedoch stets unter dem Account der entsprechenden Webapplikation unabhängig vom eingeloggten Benutzer.

Um das Feature nach dem Deployen in der Live-Umgebung per PowerShell zu aktivieren, ist folgender Befehl in der PowerShell notwendig.
>> Enable-SPFeature -Identity MyJobDefinition -url http://sharepoint/web
Geschrieben von Jan-Peter Zurek