2014-12-19 8 views
5

Ich habe mein Beispiel so weit wie möglich reduziert. In meiner Anwendung erstelle ich eine Dummy-Klasse und versuche, die Aufrufmethode in die Warteschlange zu stellen. Dies wird zur Datenbank hinzugefügt und mit delayed_jobs, die im Hintergrund ausgeführt werden, wird es aufgenommen und auf "locked" aktualisiert. Aber es beendet den Job nicht wirklich. Es bleibt nur im gesperrten Zustand.Warum wird nicht verzögerter Job Prozess in die Warteschlange eingereiht Job?

pry(main)> class DummyClass 
pry(main)* def self.call 
pry(main)*  puts 'will this ever work?' 
pry(main)* end 
pry(main)* end 
=> :call 

pry(main)> DummyClass.delay.call 

(0.2ms) BEGIN 
SQL (0.3ms) INSERT INTO `delayed_jobs` (`created_at`, `handler`, `queue`, `run_at`, `updated_at`) VALUES ('2014-12-19 12:11:40.006107', '--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class \'DummyClass\'\nmethod_name: :call\nargs: []\n', 'default', '2014-12-19 12:11:40.005811', '2014-12-19 12:11:40.006107') 
(16.2ms) COMMIT 

=> #<Delayed::Backend::ActiveRecord::Job:0x007fd0fdec0e20 
id: 22, 
priority: 0, 
attempts: 0, 
handler: "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class 'DummyClass'\nmethod_name: :call\nargs: []\n", 
last_error: nil, 
run_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00, 
locked_at: nil, 
failed_at: nil, 
locked_by: nil, 
queue: "default", 
created_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00, 
updated_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00> 

Sperrt die Aufgabe hier

SQL (0.8ms) UPDATE `delayed_jobs` SET `delayed_jobs`.`locked_at` = '2014-12-19 12:17:20.031925', `delayed_jobs`.`locked_by` = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080' WHERE ((run_at <= '2014-12-19 12:17:20.031003' AND (locked_at IS NULL OR locked_at < '2014-12-19 12:12:20.031154') OR locked_by = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 

Dann hängt er einfach. Ich verstehe nicht, warum so eine einfache Aufgabe nicht funktioniert.

Beachten Sie, dass diese Steuerkonsole auf meiner vorhandenen Rails-Anwendung ausgeführt wird. Es könnte ein Anwendungskonfigurationsproblem sein, aber ich konnte es nicht finden.

Irgendwelche Ideen? Ich kann versuchen, mehr Informationen zu geben, aber ich denke, das ist alles.

Der eigentliche Code verwende ich unter

module Events 
    class ForwardRequestToPulse 
    def self.call 
     puts 'will this ever work' 
    end 
    end 
end 

class MyTestController < ApplicationController 
    def index 
    Events::ForwardRequestToPulse.delay.call 
    end 
end 

Der Datensatz zur delayed_jobs Tabelle Fund hinzugefügt wird. Wenn ich bin/delayed_job run ausführen, ist der Datensatz gesperrt, aber nicht verarbeitet.

Unten ist ein Bild des gesperrten Datensatz Locked record in database

+0

Nur um es klar zu machen, haben Sie die Hintergrundverarbeitung gestartet? – Josnidhin

+0

Ja. Ich habe versucht, eine Variation von bin/delayed_job zu rasen Jobs: Arbeit und andere. Alle scheinen zu beginnen, aber nicht zu Ende. Die Datenbank hängt nur mit dem ersten Job, der im gesperrten Zustand in die Warteschlange eingereiht wurde. –

+0

Ok. Von dem, was ich weiß, wenn die Verarbeitung von delayed_job gestartet wird, beginnt ein neuer Prozess. Dieser neue Prozess hat möglicherweise keinen Zugriff auf die DummyClass, wie sie in der Programmiersprache definiert ist. Haben Sie versucht, einige Methoden in Ihren Modellen aufzurufen? – Josnidhin

Antwort

1

Nach In dem Juwel herumfummeln Ich habe das Problem auf "delayed_job" reduziert und nicht nach gesperrten Datensätzen gesucht. Im Filter für locked_at waren Millisekunden eingeschlossen. mySql speichert Datumswerte ohne die Millisekunden, also wurde nichts aufgenommen. Nach ein bisschen mehr Forschung in der Edelstein in GitHub delayed_job_active_record (Ich dachte, das Problem war ich!) Ich fand diese fix. Dies behebt mein Problem.

Der Grund, warum es für mich passierte, war, dass ich das neueste Juwel 4.0.2 vor diesem Fix referenzierte! Nur mein Glück.

Also, wenn Sie 4.0.2 verwenden ... nur aktualisieren und es sollte verschwinden.

4

ich mit Sidekiq mehr vertraut bin, aber ich denke, das Problem ist, dass Sie eine Klasse definieren in der Schienen-Konsole und die Arbeiter in einem sind zu laufen laufen separater Prozess. Die Mitarbeiter kennen keine DummyClass und können den Job nicht ausführen. Ich empfehle:

  1. Machen Sie diese Klasse, um eine Rails-Modell (Dummy etc.)
  2. Neustart verzögert Job
  3. Legen Sie den Datensatz in der Tabelle delayed_job
  4. prüfen verriegelten Zustand
+0

Ich stimme @eabraham zu - der Worker muss bereits Zugriff auf die Implementierung (die Klassendefinition) haben, da er den Namen und die Werte serialisiert, die später benannt werden müssen – SciPhi

+0

Ich sehe, was Sie sagen. Ich dachte, dieses Beispiel würde meine Erklärung vereinfachen. Ich bekomme immer noch das gleiche Problem, wenn ich ein Service-Objekt in meiner Rails-Anwendung verwende (Das ist mein ursprüngliches Problem). Irgendwelche Vorschläge, was der Fehler sein könnte, wenn mein Dienstobjekt das gleiche Verhalten zeigt. Delayed_job scheint den Datensatz in der Datenbank zu sperren und dann nichts zu tun. Würde es nicht wenigstens scheitern? –

+0

Können Sie den eigentlichen Code, der von DelayedJob ausgeführt wird, anstelle von Dummy-Code posten? Es ist schwer für mich zu helfen, ohne genau zu sehen, was du gerade machst. – eabraham