2010-12-16 7 views
0

Ich verwende das Plugin für verzögerte Jobs für Rails 2, und jedes Mal, wenn ich versuche, ein Modell zu modifizieren und es in der von verzögerten Jobs benötigten "Ausführen" -Methode zu speichern, schlägt es fehl (keine Fehlermeldungen oder irgendetwas, es ist nur aufgeführt) als ein Fehler in der Datenbank).Verzögerte Jobs auf Rails 2: kann nicht in "perform" -Methode speichern/wissen, wann der Job erledigt ist?

Ich habe die „perform“ Verfahren in einem meiner Schienen-Modelldateien (Video), und ich vorbei eine Instanz dieses Modells (@video, sagen wir mal) der verzögerten :: Job.enqueue

Ist es ein bekanntes Problem, dass Sie keine Datenbankänderungen in der Warteschlange vornehmen können? Mache ich etwas falsch (es schlägt nur fehl, wenn es versucht zu speichern, nicht wenn ich die Attribute tatsächlich ändere, und das klingt wie ein Datenbankmodifikationsproblem).

Wenn dies erwartet wird: Wie kann ich es beheben? Ich versuche, ein "done" -Attribut auf "true" zu speichern, damit ich weiß, wann das Modell bereit ist, um zum nächsten Schritt zu gelangen. Gibt es einen Standardweg, um herauszufinden, wann ein verzögerter Job ausgeführt wird?

EDIT: Ich habe bestätigt, dass der Aufruf von Standalone (ohne verzögerten Job) keine Probleme mit dem Speichern hat (keine Fehler oder Warnungen oder irgendetwas). Wenn ich es über DelayedJobs anrufe, schlägt es SOFORT (keine Zeitüberschreitung) in der Sekunde, in der es die Speicherzeile erreicht.

EDIT: Warte, ich denke, ich sehe, was los ist: meine "perform" ist Teil eines "after_create" -Rückrufs ... Was ist alles gut und gut, bis ich versuche zu speichern. Es sieht so aus, als wenn ich speichere, es ruft WIEDER auf (während es bereits ausgeführt wird), und das fliegt nicht mit verzögerten Aufträgen (noch sollte es). Aus irgendeinem Grund dachte ich, dass after_create nur einmal aufgerufen wird (nicht nach jedem Speichern). Warte, ein einfacher Test hat gerade gezeigt, dass das der Fall ist. Hrrm ... Also warum wird die Performance zweimal aufgerufen, wenn ich speichere, und einmal, wenn ich nicht in verzögerten Jobs bin?

Mein Code:

after_create :start_transcodes 

def start_transcodes 
    Delayed::Job.enqueue self 
end 
    def perform 
     puts "performing" 
     self.flash_status = 100 
     self.save! 
     puts "done" 
    end 

Was ich sehe:

performing 
    performing 
2 jobs processed at 3.3406 j/s, 2 failed ... 

ich es nicht sehen "done" sagen eh und je.

Was ich sehe in meinen Schienen log ist:

"* [JOB] Video failed with NameError: undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0> - 2 failed attempts 
undefined local variable or method `flush_deletes' for #<Paperclip::Attachment:0xb6e51da0>" 

ich für diese Klasse die Büroklammer Plugin verwende, und ich rufe den ganzen Tag retten kann (auch in diesem Verfahren durchführen) und keine Probleme bekommen. Ich kann auch speichern (wieder, auch in der Ausführung) den ganzen Tag aufrufen und sehe meine Methode "after_create" nicht mehr als einmal aufgerufen - WENN ich einen verzögerten Job verwende. (Könnte es eine Art automatischer Wiederholung versuchen?)

Ich werde mich um mein Paperclip-Plugin kümmern, sehen, was passiert ...

Antwort

0

Okay, nicht genau GENAU, was passiert ist, aber ich habe eine Skelett "TranscodeJob" -Klasse in meinem lib-Verzeichnis gemacht. Diese Klasse wird mit einem Verweis auf das Video initialisiert, das ich verarbeiten möchte, verarbeitet es und speichert es und spielt gut mit verzögertem Job.

Grundsätzlich sieht es so aus, als ob ich mein kompliziertes Video-Objekt (komplett mit Büroklammer-Plugins) an Delayed Job verrückte und ein einfaches Objekt weitergibt, ohne dass mehr Informationen als nötig benötigt werden.

Unten ist der Code, den ich verwendet habe, der funktioniert gut (und wenn das funktioniert, kann ich meinen langen laufenden Code nach und nach hinzufügen und bestätigen Sie es weiterhin, aber es hat früher gut funktioniert, nur Schluckauf mit Speicher

)
class TranscodeJob 
def initialize(video_id) 
    @video_id = video_id   
end 

#delayed jobs expected method 
def perform 
     @video = Video.find(@video_id) 
     @video.flash_status = 100 
     @video.save! 
end 

Ende

Dieser Code STILL aus einem after_create Filter genannt wird, und ich sehe es nicht zweimal aufgerufen, so sieht es aus wie ich DelayedJobs auto-Wiederholung für Rekursion oder etwas mistoke.

0

Wenn Ihre Sicherung fehlschlägt, hat es nichts mit delayed_job zu tun (zumindest sollte es nicht sein, es sei denn die Speicherung dauert länger als die MAX_RUN_TIME.)

Versuchen Sie, das Problem mit dem speichern der Diagnose, indem sie nicht delayed_job verwenden.

Werfen Sie auch einen Blick auf die delayed_job.log Datei in Ihrem Protokoll s

+0

Aber wenn ich "ausführen" alleine (ohne verzögerte Jobs) laufen, nichts schief geht, nichts scheitert oder Fehler oder nichts. Wenn es nur Probleme mit verzögerten Jobs hat, bedeutet das nicht, dass es ein verzögertes Jobproblem ist? Ich überprüfe die Log-Dateien, danke für den Tipp. – Jenny

+0

Äh, es gibt keine Datei "delayed_job.log". Haben Sie darüber gesprochen, wie der verzögerte Job in die normale Rails Log-Datei schreibt (in diesem Fall das Entwicklungsprotokoll?)? Wenn ja, wie ich sagte, bekomme ich keine Fehlermeldungen, es sagt nur "2 Jobs bei 0,2683 j/s verarbeitet, 2 fehlgeschlagen ... " Warten ... zwei Jobs? Ich denke ich verstehe, gib mir eine Sekunde ... – Jenny