Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Timer Jobs in DotNetNuke implementieren

DotNetNuke bringt im Standard zwar einige Timer Jobs (Zeitplaneinträge) mit, aber oftmals ist es im Rahmen einer speziellen Anwendung erforderlich, zusätzlich eigene Timer Jobs zu implementieren. Erfreulicherweise kann diesem Bedürfnis unkompliziert entsprochen werden  :-).

Dieser Beitrag demonstriert, wie es gemacht wird und was ggf. zu beachten ist. 

Zur Demonstration erstellen wir uns einen kleinen Beipspiel-TimerJob, der nichts weiter macht, als ein paar Log-Einträge zu schreiben. Das Beispiel ist in C# implementiert, die Unterschiede zu VB.NET beschränken sich aber auf die allgemeinen Syntaxunterschiede zwischen beiden Sprachen.

Zuerst benötigen wir eine Klasse, die von DotNetNuke.Services.Scheduling.SchedulerClient abgeleitet wird. Um die Klasse zu implementieren, muss die Methode DoWork() implementiert werden.

Hier kurz die Beschreibung der interessanten Stellen im Code:

  • Log-Einträge in das TimerJob-Log werden durch Aufruf der Methode AddLogNote() der Klasse ScheduleHistoryItem geschrieben.
  • Mittels der Eigenschaft Succeeded derselben Klasse wird festgelegt, ob der Lauf des Timer Jobs erfolgreich war oder nicht.
  • In diesem Beispiel wird zusätzlich bei Fehlschlagen noch eine Fehlermeldung in das DNN Event geschrieben. Dafür wird die Methode DotNetNuke.Services.Exceptions.Exceptions.LogException() verwendet.

Und so sieht die fertige Klasse aus:

Nachdem die Assembly kompiliert und im DNN Binaries-Ordner abgelegt wurde, muss der Timer Job noch in DotNetNuke bekannt gemacht sowie konfiguriert werden.

Dafür muss man sich als host in DNN anmelden und zu -> System -> Zeitplandienst -> Eintrag zum Zeitplan hinzufügen navigieren. Dort ist insbesondere der Eintrag für Klassenname und Assembly sehr sorgfältig auszufüllen. Es werden (in dieser Reihenfolge) der vollständige Klassenname (incl. Namespace), ein Komma und der Assemblyname (ohne ".dll") erwartet. Alle weiteren Einträge sind selbsterklärend bzw. gut mittels Tooltipps beschrieben.

Kleiner Wermutstropfen: es ist nicht möglich, einen Timer Job explizit so zu konfigurieren, dass er jeden Tag um eine bestimmte Uhrzeit läuft. Ein Workaround dafür wäre allenfalls, den Job auf  "alle 1 Tage" einzustellen und erstmals manuell um die gewünschte Uhrzeit zu starten.

Der folgende Screenshot zeigt eine Konfiguration, in der der Timer Job alle 5 Minuten läuft, es werden die Logs für jeweils 100 Durchläufe aufgehoben.

Und das war es auch schon :-). Ist der Timer Job erst einmal gespeichert, kann mittels Jetzt ausführen der Timer Job testweise manuell gestartet und mittels Ausführungsprotokoll anzeigen das Log des aktuellen Durchlaufes eingesehen werden.

Fazit: DotNetNuke Timer Jobs sind einfach zu erstellen, wenn man die Grundanforderungen beachtet. Mit etwas Planung und Logging ist es auf diese Weise möglich, auch komplexere Business Requirements umzusetzen.

Abschließend die erstellte Klasse zum besseren Kopieren nochmal als Text:

using System;

namespace SampleNamespace
{

public class SampleTimerJob : DotNetNuke.Services.Scheduling.SchedulerClient
{
private readonly DotNetNuke.Services.Scheduling.ScheduleHistoryItem _history;

public SampleTimerJob(DotNetNuke.Services.Scheduling.ScheduleHistoryItem history)

{
_history = history;
}public override void DoWork()

{
try
{
_history.AddLogNote(string.Format("TimerJob {0} started. ", GetType().Name));

//Hier kommt die Implementierung der durch den TimerJob auszuführenden Aktion(en)
_history.AddLogNote("Do something... ");

_history.AddLogNote(string.Format("TimerJob {0} ended successfully. ", GetType().Name));
_history.Succeeded = true;
}
catch (Exception ex)
{
_history.Succeeded = false;
_history.AddLogNote(string.Format("TimerJob {0} failed: {1}. ", GetType().Name, ex));
DotNetNuke.Services.Exceptions.Exceptions.LogException(ex);
Errored(ref ex);
}
}
}
}

 

30. Dezember 2011
|

Related Posts

Pin It on Pinterest