Ich habe den Verdacht, dass einige unserer aktiven Jobs verschwinden, aber ich weiß nicht warum. Unten ist eine, ich habe die Beweise für sein Verschwinden gefunden, aber nicht den Grund dafür.
Unsere Website nutzt einen externen Cloud-Druckdienst. Wir kicken die Jobs ab und überprüfen dann ihren Status. Nachdem der Remote-Cloud-Druck erfolgreich erstellt wurde, erstellen wir einen aktiven Job, um den Status sofort zu überprüfen. Wenn es fertig ist (erfolgreich oder nicht), wird es als solches markiert. Wenn nicht, erstellt der Prüfstatus-Job mit leichter Verzögerung einen weiteren Job. Die Verzögerung erhöht sich jedes Mal.
Ein Status-Check heute, die Protokolle zeigen, dass die Wartezeit 128 Sekunden erreicht hat. Aber die nächste Statusüberprüfung ist nicht aufgetreten, und es gibt auch keine Fehler im Protokoll.
Wir verwenden aktiven Job, der durch einen verzögerten Job unterstützt wird. Der Code für den Job zur Statusprüfung ist unten. Es kann keinen Fehler in der Logik erkennen, der weder zu einer korrekt gesammelten Statusüberprüfung noch zu einem weiteren Versuch mit einer Wartezeit führen würde.
%Vor%Richtig, es gibt keinen Fehler in der angegebenen Logik, der entweder zu einer korrekt gesammelten Statusüberprüfung oder zu einem anderen Versuch mit einer Wartezeit führen würde.
Ich habe überprüft, dass sich Ihr Jobcode nach einer Wartezeit von 128 Sekunden erfolgreich mit dem folgenden Setup verhält:
rails new
Projekt delayed_job_active_record
hinzugefügt zu Gemfile
(läuft bundle install
) rails generate delayed_job:active_record
und rake db:migrate
, um Edelsteine zu installieren und die Delayed Job DB-Tabelle zu erstellen config.active_job.queue_adapter = :delayed_job
in config/application.rb
CloudPrint < ApplicationRecord
-Modell mit update_status
, finished?
und mark_as_failed
-Methoden in app/models/cloud_print.rb
app/jobs/check_cloud_print_status_job.rb
CheckCloudPrintStatusJob.perform_later(CloudPrint.create)
über die Rails-Konsole ( bin/rails c
) Da sich die obige Sequenz ohne Probleme korrekt verhalten hat, müssen Sie Ihre Suche erweitern, indem Sie ein vollständiges und überprüfbares Beispiel zur Verfügung stellen reproduziert das Problem tatsächlich. Laden Sie Ihr gesamtes Rails-Projekt in ein GitHub-Repository hoch, sobald Sie Ihr Problem konsistent reproduzieren konnten, oder untersuchen Sie andere Aspekte Ihrer Umgebung und Projektkonfiguration. Hier sind einige Möglichkeiten:
rake jobs:clear
) finished?
könnte true
zurückgegeben haben, nachdem update_status
aufgerufen wurde, was dazu führte, dass die endgültige Statusüberprüfung nicht gedruckt wurde, obwohl die Verarbeitung erfolgreich abgeschlossen wurde. N.B. - Der verzögerte Job unterstützt das Wiederholen fehlgeschlagener Jobs mit einer Verzögerung von 5 seconds + N ** 4
, wobei N
die Anzahl der Versuche ist. Diese Logik muss nicht erneut implementiert werden. Nur raise
eine Ausnahme, wenn cloud_print.finished?
falsch ist, und Sie sollten keinen anderen benutzerdefinierten Verzögerungscode benötigen:
Das Argument cloud_print
ist eine Instanz einer Ruby-Klasse (scheint ActiveRecord :: Base). Im Allgemeinen ist es keine gute Idee, Objekte als Argumente für einen Hintergrundjob zu komplizieren, da diese Argumente in string, json oder yaml serialisiert werden müssen. DelayedJob verwendet YAML-serialisierte Objekte und manchmal ist es möglicherweise nicht möglich, eine Modellinstanz wiederherzustellen. Beispiel: Wenn der verzögerte Job als Callback ausgeführt wird before_create
- Das Modellobjekt wurde nicht gespeichert und konnte nicht wiederhergestellt werden. Weitere Informationen finden Sie hier Ссылка
Tags und Links ruby-on-rails rails-activejob delayed-job