2016-07-11 3 views
2

Tut der: async-Warteschlangenadapter tatsächlich etwas?Rails Async Active Job führt keinen Code aus, während inline

: Inline, das ist der Standard in Rails 4, verarbeitet Jobs, die mit ActiveJob, äh ... inline, im aktuellen Ausführungsthread erstellt werden. Asynchron, sollte nicht. Es sollte den ConnectionPool verwenden, um es nicht im aktuellen Thread auszuführen, und das ist im Idealfall, was passieren würde. Es würde Ausführung außerhalb des aktuellen Ausführungsthreads ausführen.

Aber nichts führt es aus.

Ich habe die Dokumente durchforstet, und das einzige, was ich ergründen kann, ist: async, im Gegensatz zu: inline, führt keine Aufgaben aus und erwartet von Ihnen, dass Sie ein System um die Ausführung lokal erstellen. Ich muss perform für alle Jobs manuell ausführen, um sie lokal ausführen zu lassen. Wenn ich den Adapter auf: Inline setze, funktioniert es gut, ohne dass ich es ausführen muss.

Gibt es ein Konfigurationsproblem, das mir fehlt, das verhindert, dass Async korrekt funktioniert (wie ActionCable?).

Funktioniert es nicht, wenn es von einer Rake-Task (oder der Konsole?) Ausgeführt wird.

Es funktioniert gut mit: sidekiq /: resque, aber ich möchte nicht diese lokal die ganze Zeit laufen.

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

Dies ist eine Art, was mich dort Cueing ist in etwas falsch zu sein. Ich habe Jobs, die irgendwo in einer Schlange sitzen, die einfach nicht laufen. Was könnte das aufhalten?

Antwort

4

Das habe ich entdeckt. Mit dem Aufkommen von gleichzeitigem Ruby sind Rake-Tasks nicht dafür eingerichtet.

Wenn Sie in der Dokumentation lesen, es heißt mit :async, wird es aus dem Speicher gelöscht, wenn der Prozess endet.

Rails selbst bietet nur ein In-Process-Warteschlangensystem, das nur die Jobs im RAM hält. Wenn der Prozess abstürzt oder der Computer zurückgesetzt wird, gehen alle ausstehenden Jobs mit dem standardmäßigen asynchronen Back-End verloren.

Rake-Prozesse enden, wenn sie vorbei sind. Also, wenn Sie irgendeine Art von Datenänderungen vornehmen, werden Rake-Aufgaben nicht lange genug geöffnet, um einen Job auszuführen, weshalb sie :inline funktionieren, aber nicht :async.

Also, ich habe keine Lösung gefunden, um Rake-Aufgaben lange genug offen zu lassen, um etwas zu starten :async (und behalten Sie die App :async die ganze Zeit). Ich muss es zu :inline wechseln, um Aufgaben auszuführen, und dann zurück zu :async, wenn ich für den Rest meiner Jobs fertig bin. Deshalb funktioniert es problemlos mit :sidekiq oder :resque, da diese Anwendungen die Auftragsinformationen im Speicher behalten und nicht freigeben, wenn die Rake-Task beendet ist.

Damit Rake Aufgaben mit :async lokal zu arbeiten, gibt es nicht viel können Sie andere tun, als laufen Aufgaben wie :inline, wenn Sie bis zum Rechen lokalen sind (als Aufgabe Läufer) versteht, wie offen zu bleiben, während asynchrone Aufgaben gewesen gestartet (oder nicht).Als ein Feature nur Entwicklung, das ist nicht wirklich hohe Priorität, aber, wenn Sie Ihren Kopf auf den Tisch schlagen nicht zu verstehen, warum :async standardmäßig Aufgaben, die Jobs ausführen wird nicht ausgeführt werden, deshalb.

+0

@januszm froh, ich könnte Ihnen ein wenig Hilfe bekommen. – tadiou

Verwandte Themen