So führen Sie geplante Aufgaben in Orchard aus

Ich muss alle 5 Stunden einen automatisierten Job ausführen.

Ich habe diesen Beitrag zum Erstellen von geplanten Aufgaben mit IScheduledTaskHandler und IScheduledTaskManager gefunden.Geplante Aufgaben mit Orchard CMS

Ich habe den gleichen Code kopiert und meinen Serviceabruf in der Prozessfunktion hinzugefügt. Es kompiliert gut. Ich bin mir jedoch nicht sicher, ob ich diese geplante Aufgabe wie einen Windows-Dienststart starten muss. Wird es automatisch abgeholt, nachdem ich die Lösung erstellt habe? Wann beginnt die Uhr zu ticken, wenn ich diesen Job in 5 Stunden ausführen möchte? Und wenn ich anhalten / pausieren möchte, wie kann ich das tun?

Vielen Dank.

BEARBEITEN:

Ich erhalte eine Ausnahme, wenn ich versuche, das benutzerdefinierte Modul mit dem Task-Handler zu aktivieren.

Ausnahmedetails: System.ArgumentNullException: Der Wert darf nicht null sein. Parametername: Quelle

Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);

Quelldatei: \ orchard-1.4 \ src \ Orchard \ Environment \ DefaultOrchardHost.cs Zeile: 241

Der _shellContexts wird als null angezeigt. Wenn ich die Task-Handler-Klasse aus dem Projekt / Modul entferne, funktioniert alles einwandfrei.

Hier ist der Task-Handler-Code.

public class ScheduledTaskHandler : IScheduledTaskHandler
{
    private const string TaskType = "MyTaskUniqueID";
    private readonly IScheduledTaskManager _taskManager;
    private readonly IMyService _myService;

    public ILogger Logger { get; set; }

    public ScheduledTaskHandler(IScheduledTaskManager taskManager, IMyService myService)
    {
        _myService = myService;
        _taskManager = taskManager;
        Logger = NullLogger.Instance;
        try
        {
            DateTime firstDate = new DateTime().AddMinutes(5);
            ScheduleNextTask(firstDate);
        }
        catch (Exception e)
        {
            this.Logger.Error(e, e.Message);
        }
    }

    public void Process(ScheduledTaskContext context)
    {
        if (context.Task.TaskType == TaskType)
        {
            try
            {
                _myService.RunJob();
            }
            catch (Exception e)
            {
                this.Logger.Error(e, e.Message);
            }
            finally
            {
                DateTime nextTaskDate = new DateTime().AddHours(5);
                ScheduleNextTask(nextTaskDate);
            }
        }
    }

    private void ScheduleNextTask(DateTime date)
    {
        if (date > DateTime.UtcNow)
        {
            var tasks = this._taskManager.GetTasks(TaskType);
            if (tasks == null || tasks.Count() == 0)
                this._taskManager.CreateTask(TaskType, date, null);
        }
    }


}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage