2016-07-20 22 views
3

Ich habe einen Hangfire Server mit ~ 50 wiederkehrenden Jobs. Hangfire Einstellung auf IIS wie in this example. Recurring Jobs hinzugefügt in startup.cs wie diese hangfire:Wie wird nur ein Job gleichzeitig ausgeführt?

RecurringJob.AddOrUpdate(job.desctiprion, 
      () => job.startJob(), 
      job.cron, 
      TimeZoneInfo.Local); 

Ich brauche neue wiederkehrende Aufgabe hinzuzufügen, die jede Minute läuft. Aber es gibt kaum eine Chance, dass dieser Job länger läuft. Mein Ziel ist es, gleichzeitig nur ein Exemplar dieses Jobs zu bearbeiten.

Welche Lösungen gibt es? So wie ich es verstehe, brauche ich etwas wie Warteschlange mit einem Thread, aber Warteschlangen unterstützen keine Thread-Einstellungen.

+0

Es ist nicht klar, was Sie versuchen zu tun, ‚nur ein‘ und ‚gleichzeitig‘ scheinen nicht wirklich zusammen zu gehen. Dies: * um gleichzeitig nur ein Exemplar dieses Jobs zu bearbeiten * macht keinen Sinn. Könntest Du das erläutern? –

+0

Sie wollen also nur sicherstellen, dass dieser Job sich nicht mit sich selbst überschneidet? – DavidG

+0

Ich muss Situation vermeiden, wenn in einem Moment mehr als eine Instanz dieses wiederkehrenden Jobs in Bearbeitung ist. Ja, ich möchte nur sicherstellen, dass dieser Job sich nicht mit sich selbst überschneidet. Zum Beispiel: erster Job läuft um 17:00 und dieser Lauf dauert 2 Minuten 30 Sekunden. Ich muss Job in 17:01 und 17:02 vermeiden, aber Job in 17:03 laufen lassen. Ich verstehe, dass ich jedes Flag in der Datenbank für die Überprüfung verwenden kann, ob der Job jetzt ausgeführt wird. Aber vielleicht hat Hangfire eine einfache und korrekte Lösung für diesen Fall. – sintasy

Antwort

5

Sie können den Filter DisableConcurrentExecution verwenden, um gleichzeitige Ausführungen zu verhindern.

[DisableConcurrentExecution(timeoutInSeconds: 60)] 
public void SomeJob() 
{ 
    //method body 
} 

Dieser Filter stellt eine verteilte Sperre am Anfang eines Verfahren Leistung und gibt es nach seiner Fertigstellung des IServerFilter Schnittstelle. Der Typ und der Methodenname werden als Sperrressourcen verwendet. Jeder Speicher verwendet seine eigene verteilte Sperre Implementierung. (read more here)

+2

Danke, Sie antworten ist sehr hilfreich. Kann auch [AutomaticRetry (Attempts = 0)] verwendet werden, um große Anzahl von Jobs bei der Wiederholung zu vermeiden. – sintasy

-1
var worker = new BackgroundWorker(); 
worker.DoWork += worker_DoWork; 
worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     // do your task here 
} 
private void worker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) 
{ 

     //Do when completed 
} 
+0

können Sie Hintergrundarbeiter verwenden –

+1

Ihre Antwort weicht von dem ab, was OP fragt. Er benutzt Hangfire für die Hintergrundverarbeitung. Die Verwendung von "BackgroundWorked" für diesen Zweck wäre eine völlig andere Sache. – Yogi