2016-05-23 7 views
3

Ich habe mit Hangfire in einer Microsoft MVC-Anwendung gespielt. Ich habe es geschafft, Fire-and-Forget-Aufgaben zu kompilieren und zu planen, aber ich bin überrascht, dass ich keine Jobs hinzufügen/entfernen kann, während das Programm läuft. Stimmt es, dass Hangfire Aufgaben zur Laufzeit nicht dynamisch planen kann? Gibt es ein wohlbekanntes Framework, das es ermöglicht, Tasks auch nach der Kompilierung oder Bereitstellung der Anwendung zu planen, ohne den C# -Code jedes Mal ändern zu müssen, wenn ich Aufgaben hinzufügen möchte?Kann Hangfire Änderungen an geplanten Aufgaben ohne Neuinstallation verarbeiten

Ich habe auch Quartz.NET erforscht, und es scheint das gleiche Problem zu haben.

EDIT:

Windows-Taskplaner erlauben können Aufgaben mit einer GUI geplant werden, und UNIX cron können Aufgaben hinzugefügt oder entfernt haben, indem Sie eine Datei bearbeiten, aber ich bin für eine Art von Anwendung ausgeführt suchen unter Windows, die es dem Benutzer ermöglichen würde, Aufgaben hinzuzufügen oder zu entfernen nach die Anwendung wurde bereitgestellt. Ich möchte die Anwendung nicht jedes Mal neu kompilieren, wenn ich Aufgaben hinzufügen oder entfernen möchte.

+0

I bin vertraut mit Quartz.NET, so hat Ihre letzte Aussage eine Flagge ausgelöst. Ich warf einen kurzen Blick auf die Hangfire-Dokumentation, und ich bin mir nicht sicher, ob Ihr Verständnis korrekt ist ... –

+0

Nach meinem Verständnis kann Hangfire Aufgaben planen, kein Problem. Aber nur Aufgaben, die Sie in C# fest programmiert haben. Während Hangfire läuft, habe ich keine Möglichkeit gefunden, Aufgaben dynamisch nach der Kompilierzeit hinzuzufügen. Nirgends in den Dokumenten habe ich festgestellt, dass Hangfire Aufgaben zur Laufzeit dynamisch planen kann. –

+0

Ihre Frage ist mehrdeutig und verwirrend. "... Aufgaben während der Laufzeit dynamisch planen." Das bedeutet natürlich "Hinzufügen und Entfernen neuer einfacher/verzögerter/geplanter Tasks zur Laufzeit", die sowohl Quartz als auch Hangfire ausführen. Sie können sicherlich "Jobs hinzufügen/entfernen, während das Programm läuft." Sie scheinen nach etwas anderem zu fragen, einem Werkzeug, das indexieren und Ihnen erlauben kann, dynamisch definierten Code oder Code aus einer zur Laufzeit geladenen Bibliothek auszuführen. Das ist ein * ganz anderes * Problem, und nicht ein Job-Scheduler ist so konzipiert, dass er OOTB anspricht. –

Antwort

1

Die Frage scheint, wie gesagt, auf einem Missverständnis der Bedeutung von "dynamisch ... zur Laufzeit" zu beruhen. Die Antwort ist "Ja", es kann Aufgaben ändern, ohne erneut zu implementieren (aber das scheint nicht das zu sein, wonach Sie wirklich suchen).

Hangfire fügt Ihrer Anwendung eine Dashboard-Benutzeroberfläche hinzu, wenn Sie dies konfigurieren, aber es ist keine End-to-End-Task-Management-Anwendung. Es wurde entwickelt, um Ihre Anwendung die Möglichkeit zu geben, Arbeit zu planen, und diese Arbeit in einem sehr getrennten Weg vom Zeitpunkt des Aufrufs abgeschlossen zu haben - es kann nicht einmal auf dem gleichen Computer abgeschlossen werden.

Es ist begrenzt auf den Aufruf von .NET-Code, aber per Definition Dies erfüllt Ihre angegebene Anforderung "dynamisch Aufgaben während der Laufzeit zu planen." Dies kann als Reaktion auf ein beliebiges Ereignis in Ihrer Anwendung erfolgen. Aufgaben können auch entfernt, aktualisiert und abgebrochen werden.

(Post-Edit) Sie haben Recht: jede Planung UI oder Deserialisierung des Task-Datei-Format müssen Sie selbst schreiben. Wenn Sie nach einem Tool suchen, das Ihnen eine Benutzeroberfläche und/oder Task-Datei OOTB bietet, müssen Sie möglicherweise zu einem kommerziellen Produkt wie JAMS wechseln. (Disclaimer: Dies kann nicht einmal selbst die Fähigkeiten haben, die Sie benötigen - ich habe keine direkte Erfahrung mit dem Produkt, aber die Leute, mit denen ich gearbeitet habe, haben es positiv erwähnt).

+0

Vielen Dank. Ich schätze Ihre Antwort. JAMS sieht tatsächlich ziemlich glatt aus. Ich muss ihre Dokumentation durchlesen, um zu sehen, ob sie meinen Bedürfnissen entspricht. –

0

Erstellen Sie eine API, um Jobs nach der Laufzeit dynamisch zu planen. Ihre API kann Eingaben über HTTP-Get/Put/Post/Delete usw. akzeptieren und dann eine Instanz von irgendetwas in Ihrem Code beim API-Aufruf unter Verwendung der von Ihnen angegebenen Daten ausführen.

Angenommen, Sie haben eine fest codierte Aufgabe A und Aufgabe B in Ihrem Code und möchten diese so planen, dass sie dynamisch unter Verwendung verschiedener Parameter ausgeführt werden. Sie können eine API erstellen, die die gewünschte Aufgabe zur angegebenen Zeit unter Verwendung der von Ihnen gewählten Parameter ausführt.

[HttpPost] 
public IHttpActionResult Post([FromBody]TaskDto task) 
{ 
    var job = ""; 
    if(task.TaskName == "TaskA"){ 
     job = BackgroundJob.Schedule(() => RunTaskA(task.p1,task.p2), task.StartTime); 
    } 
    if(task.TaskName == "TaskB"){ 
     job = BackgroundJob.Schedule(() => RunTaskB(task.p1,task.p2), task.StartTime); 
    } 

    if(!string.IsNullOrWhiteSpace(task.ContinueWith) && !string.IsNullOrWhiteSpace(job)){  
     if(task.ContinueWith == "TaskB"){ 
      BackgroundJob.ContinueWith(job,() => RunTaskB(task.p3,task.p4)); 
     } 
     if(task.ContinueWith == "TaskA"){ 
      BackgroundJob.ContinueWith(job,() => RunTaskA(task.p3,task.p4)); 
     } 
    } 
    return Ok(job) 
} 

Dann können Sie die API-Aufruf eines JSON-POST (Beispiel mit Hilfe von JavaScript) mit

// Sending JSON data to start scheduled task via POST 
// 
var xhr = new XMLHttpRequest(); 
var url = "https://www.example.com/api/scheduletask"; 
xhr.open("POST", url, true); 
xhr.setRequestHeader("Content-type", "application/json"); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4 && xhr.status === 200) { 
     var json = JSON.parse(xhr.responseText); 
    } 
}; 
var data = JSON.stringify({"TaskName": "TaskA", "ContinueWith": "TaskB", 
"StartTime": "2-26-2018 10:00 PM", "p1": "myParam1", "p2": true, 
"p3": "myParam3", "p4": false}); 
xhr.send(data); 

Für Vollständigkeit des Beispiels ist hier die TaskDto Klasse für dieses Beispiel

public class TaskDto 
{ 

    public string TaskName { get; set; } 
    public string ContinueWith { get; set; } 
    public DateTime StartTime { get; set; } 
    public string p1 { get; set; } 
    public bool p2 { get; set; } 
    public string p3 { get; set; } 
    public bool p4 { get; set; } 

} 
Verwandte Themen