Ich habe vor kurzem angefangen, mit Sidekiq zu arbeiten und habe festgestellt, dass es eine tolle Funktion hat, nach der ich schon lange gesucht habe:
%Vor%Grundsätzlich kann ich einen Job in der Zukunft planen, sodass meine App nicht ständig nach neuen Ereignissen mit einer Startzeit suchen muss.
Das funktioniert jetzt wie ein Zauber, aber wie ändere ich die Startzeit eines Jobs? Bei einigen geplanten Ereignissen wird die Startzeit geändert. Wie repliziere ich das in sidekiq?
Ich weiß, dass ich den Job löschen und einen neuen erstellen kann, aber ist es möglich, nur die Startzeit zu ändern?
BEARBEITEN :
Ich baute auf Oto Brglez Idee auf und hier ist der dokumentierte Code:
%Vor%Wenn ich das jetzt mache
%Vor%die Aufgabe wird in 4 Stunden ausgeführt und der andere Job (der in 5 Stunden ausgeführt wird) wird ignoriert und entfernt, wenn es seine Zeit erreicht.
Anfangs habe ich Time.now
anstelle von worker.last["payload"]["at"]
versucht, aber das könnte ziemlich ungenau gewesen sein, weil ein geplanter Job nicht immer pünktlich ausgeführt wird. Es gibt ein Überprüfungsintervall von 15 Sekunden, und wenn alle Mitarbeiter anderweitig beschäftigt sind, kann sich der Job weiter verzögern.
Ich musste Regexp
verwenden, um die Startzeit zu vergleichen, denn beim Lesen von task.start
hätte ich möglicherweise einen Gleitkommawert mit einer anderen Anzahl von Dezimalzahlen erhalten, und die if-Bedingung würde nicht bestehen. Auf diese Weise bekomme ich beide Werte auf 3 Dezimalstellen.
Ich fand, dass die einzige Möglichkeit, das "at" -Attribut des Jobs zu bekommen, darin besteht, es durch den Arbeiter zu bekommen. Wenn ich Redis fragen oder Mikes Sidekiq::ScheduledSet.new
verwenden würde, würde ich den aktuellen Job nicht bekommen, weil er bereits aus Redis herausgezogen worden wäre.
BEARBEITEN 2 :
Für jeden Interessierten ging ich mit einem ähnlichen aber anderen Ansatz. Im Grunde habe ich, anstatt die Startzeit von Task
zu vergleichen, ein zusätzliches Feld zum Modell und Sidekiq Aufruf hinzugefügt, genannt start_token
. Wenn der sidekiq-Job mit demselben Token aufgerufen wurde wie das Objekt, ist es gültig, ansonsten wird der Job verworfen und übersprungen. Das Token wird jedes Mal aktualisiert, wenn das Modell start_time ändert.
Ich denke nicht, dass das Bearbeiten / Aktualisieren von Jobs der richtige Weg ist. Normalerweise erstelle ich jedes Mal einen neuen Job, wenn sich etwas ändert. Und dann im Job selbst überprüfen, ob die Zeit für die Ausführung bestimmter Aufgaben richtig ist ... Wenn die Zeit stimmt, fahre mit der Aufgabe fort, ansonsten überspringe einfach ...
Tags und Links ruby ruby-on-rails sidekiq