SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure
SharePoint und Long Running Operations

Blogs

Oliver Wirkus

Syndication

Certifications

Web 2.0

http://smits-net.de/img/linkedin_button.gif

XING

http://i80.photobucket.com/albums/j191/mikesamerica/twitter_button_zpsee74f711.png

 

 Add to Technorati Favorites

 

 Delicious Bookmark this on Delicious

 

  Locations of visitors to this page

 

Manchmal gibt es sie doch: lang andauernde Operationen in SharePoint. Es gibt solche lang andauernden Operationen bei SharePoint selbst (z.B. beim Anlegen einer neuen Site basierend auf einem Site-Template), oder beim Aktivieren von Features (z.B. beim Aktivieren des Content Organizers). Es gibt diese aber auch, wenn Business-Prozesse in SharePoint umgesetzt werden sollen (z.B. das Importieren von Daten in SharePoint Listen). Man kann sicher geteilter Meinung darüber sein, wie man solche Operationen in SharePoint am besten umsetzen sollte. Auch wenn man bei solchen Operationen zuerst an einen Timer Job denkt … letztendlich hängt die Umsetzung sehr stark von den Anforderungen ab.

Es gib zwei Arten, wie solche lang andauernden Operationen durch SharePoint unterstützt werden:

  1. Long Running Operation
  2. Long Running Operaton Job

In diesem Artikel möchte ich diese beiden Möglichkeiten etwas näher vorstellen.

Die Long Running Operation ist gedacht für synchrone Abläufe. Dazu ein kurzes Beispiel: im Code ist irgendwo ein Abschnitt, dessen Ausführung länger dauern kann. Diesen Abschnitt ‘umgibt’ man dann mit eine Art Markierung. ‘Hier beginnt die LRO’ bzw. ‘Hier endet die LRO’. Während die LRO (Long Running Operation) läuft, blendet SharePoint den bekannten Gear (der rotierende grüne Donut) ein. Das sieht dann ungefähr so aus, wie in der folgenden Abbildung dargestellt:

In einer sehr vereinfachten schematischen Darstellung sieht der Ablauf ungefähr so aus:

image

Für die eigentliche Umsetzung steht die Klasse SPLongRunningOperation zur Verfügung. Ein gutes Beispiel, wie so eine Umsetzung konkret aussehen kann, habe ich unter anderem im Blog von Peter Heibrink gefunden. Hier der Link zu seinem Artikel. Zu beachten ist, dass diese Operation im Kontext des aktuellen Users abläuft und dadurch der üblichen Timeout-Problematik unterliegt. Zu diesem Thema finden sich im Blog von Dennis Gorelik in seinem Artikel How to set execution timeout for individual requests hilfreiche Informationen. Eine weitere gute Zusammenfassung mit Codebeispielen findet man im Blog vom .NET Follower unter diesem Link:

Die Klasse SPLongRunningOperation eignet sich also in erster Linie für kürzere Operationen, die ‘ungestört’ ablaufen sollen.

Um einen bekannten Spruch aus einer Werbung zu zitieren: “Wenn es mal wieder etwas länger dauert …”  - auch dafür bietet SharePoint entsprechende Unterstützung in Form der Klasse LongRunningOperationJob. Diese Klasse ist eher für asynchrone und wirklich lang andauerende Operationen gedacht und ist daher einem TimerJob nicht unähnlich. Während bei der Klasse SPLongRunningOperation die eigentliche Operation direkt in den Codeablauf integriert ist, sieht es bei der Klasse LongRunningOperation etwas anders aus, wie die folgende schematische Darstellung zeigt:

image

Die eigentliche lang andauernde Operation wird in eine eigene Klasse ausgelagert. Während des Ablaufs wird in festen (zuvor definierten Zeitabstände) nachgefragt, welchen aktuellen Status die LRO hat. Dabei kommt es -vereinfacht ausgedrückt- zu Thread- bzw. Kontextwechseln, die bei der Umsetzung unbedingt beachtet werden müssen. Mir selbst ist es schon passiert, dass ich in der LRO Methoden bzw. Klassen verwendet habe, die nicht threadsicher waren. Dabei ist es dann zu sehr unschönen Fehlerzuständen gekommen!

Beim Anlegen einer eigenen Instanz der Klasse LongRunningOperation kann man einige (teilweise wichtige) Parameter angeben. Neben dem Titel ist dies vor allem der Parameter MilliSecondsToWaitForFinish, der bestimmt, wie oft (bzw. in welchen Zyklen) während der Laufzeit der eigentlichen LRO nach dem Status gefragt wird. Zusätzlich kann angegeben werden, wie viele Teiloperationen während der Laufzeit ausgeführt werden sollen. Dieser Parameter beeinflusst auch die Anzeige:

Die Länge des Balkens zeigt an, wieviele Teiloperationen bereits ausgeführt wurden und wieviele noch ausgeführt werden sollen. Der Ablauf der LRO sollte zwar eigentlich ungestört bleiben, aber dennoch bietet diese Klasse die Möglichkeit, die Operation durch den Benutzer (per Klick auf einen Cancel-Button) abbrechen zu lassen. Wie man das macht hat Jayaseelan in seinem Artikel Cancel the LongRunningOperationJob in SharePoint 2007 when click on Cancel button beschrieben. Den Status einer LongRunningOperation kann man aus der versteckten Status Liste auslesen. Larry Kuhn beschreibt dies in seinem Blog-Artikel, den man über diesen Link erreichen kann.

Wichtig ist noch zu erwähnen, dass die Verwendung der Klasse LongRunningOperation (Namespace Microsoft.SharePoint.Publishing.Internal) zwingend das Publishing Feature von SharePoint benötigt.

Im Blog von Sue Hernandez findet sich in ihrem Artikel SharePoint 2007 - Long Running Operations eine gute Zusammenfassung mit Einsatzbeispielen für beide Klassen. Ein gutes Beispiel findet sich auf im Blog von hubKey unter diesem Link.

Leider ist die Verwendung der LongRunningOperationJob-Klasse nicht so gut dokumentiert, wie die Verwendung der Klasse SPLongOperation. Ich habe daher in diesem Artikel mein Wissen darüber zusammengetragen und möchte mit der Anmerkung schliessen, dass es mich immer einigen Debug-Aufwand kostet, bis ein LongRunningOperationJob tatsächlich so läuft, wie ich es will bzw. die Anforderung es vorschreibt.

Add to Technorati Favorites Folge mir auf Twitter FourSquareLogo

Bereitgestellt 1 Feb 2013 13:01 von Oliver Wirkus
Gespeichert unter: ,