Hangfire: So überspringen Sie gleichzeitige Ausführungen, ohne dass der Job fehlschlägt

Erstellt am 11. Juli 2017  ·  4Kommentare  ·  Quelle: HangfireIO/Hangfire

Ich habe einen minutiös wiederkehrenden Job, der DisableConcurrentExecution(timeout:0) (0 Wiederholungen) verwendet, da nur ein Arbeiter ihn zu einem bestimmten Zeitpunkt verarbeiten sollte, insbesondere wenn der Job länger als eine Minute dauert (es variiert).

Ich möchte nicht, dass die "übersprungenen" Jobs im Dashboard als failed , also wollte ich ein SkipConcurrentExecutionAttribute hinzufügen, das fast identisch mit DisableConcurrentExecutionAttribute , außer dass es versuchen würde, die Sperre zu umgehen und DistributedLockTimeoutException schlucken und den Job mit dem Grund auf DeletedState zu setzen.

Aber ich kann dies nicht richtig machen, weil GetResource() privat ist und seine Implementierung auf andere Methoden verweist, die in der Bibliothek intern sind.
$"{job.Type.ToGenericTypeString()}.{job.Method.Name}" scheint der sichere Weg zu sein, um konfliktfreie verteilte Sperrnamen zu erzeugen, aber ich kann mich nicht darauf beziehen.
Können wir in der lib eine öffentliche Methode haben, die den verteilten Sperrnamen des Jobs generiert?

vgl., https://discuss.hangfire.io/t/disableconcurentexecution-for-job-groups/1389/4

question

Hilfreichster Kommentar

@dgaspar , Sie können den wiederkehrenden Job-Scheduler .

Alle 4 Kommentare

Mir ist gerade aufgefallen, dass filterContext.BackgroundJob.Job.ToString() die gleiche Zeichenfolge wie die interne TypeExtensions.cs und DisableConcurrentExecutionAttribute.cs (Re-)Implementierungen geben würde... Problem gelöst.

@dgaspar , Sie können den wiederkehrenden Job-Scheduler .

Danke für den Vorschlag @odinserj. Mir ist aufgefallen, dass die Zeile "Running" in der Hash-Tabelle verbleibt, wenn der Worker während der Ausführung abstürzt. Wird es verhindern, dass der Job neu geplant wird, bis ich diese Zeile manuell lösche? Oder gibt es einen Ablauf / eine Bereinigung, die ich vermisse? (Übrigens verwende ich new SqlServerStorageOptions { SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5) } , falls das wichtig ist)

Wenn ein Worker während der Ausführung eines Hintergrundjobs beendet wird, wird dieser Hintergrundjob automatisch neu geplant, da alle Message-Queues transaktional sind (zumindest die offiziellen, andere Speicherimplementierungen sollten sich genauso verhalten).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen