2011-01-14 17 views
5

Der Versuch, einen Job mit delayed_job Warteschlange wie folgt:Sonderbare Ausnahme mit delayed_job

Delayed::Job.enqueue(BackgroundProcess.new(current_user, object)) 

current_user und Objekt sind nicht gleich Null, wenn ich sie ausdrucken. Das Seltsame ist, dass manchmal das Aktualisieren der Seite oder das Ausführen des Befehls funktioniert! Hier

ist die Ausnahme-Trace:

Delayed::Backend::ActiveRecord::Job Columns (44.8ms) SHOW FIELDS FROM `delayed_jobs` 

TypeError (wrong argument type nil (expected Data)): 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml.rb:391:in `emit' 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml.rb:391:in `quick_emit' 
    /Users/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/yaml/rubytypes.rb:86:in `to_yaml' 
    vendor/plugins/delayed_job/lib/delayed/backend/base.rb:65:in `payload_object=' 
    activerecord (2.3.9) lib/active_record/base.rb:2918:in `block in assign_attributes' 
    activerecord (2.3.9) lib/active_record/base.rb:2914:in `each' 
    activerecord (2.3.9) lib/active_record/base.rb:2914:in `assign_attributes' 
    activerecord (2.3.9) lib/active_record/base.rb:2787:in `attributes=' 
    activerecord (2.3.9) lib/active_record/base.rb:2477:in `initialize' 
    activerecord (2.3.9) lib/active_record/base.rb:725:in `new' 
    activerecord (2.3.9) lib/active_record/base.rb:725:in `create' 
    vendor/plugins/delayed_job/lib/delayed/backend/base.rb:21:in `enqueue' 

Antwort

7

Ich würde vermuten, dass es durch die Tatsache verursacht wird, dass Sie die Objekte als Argumente an Ihre Jobs für (zumindest ich, dass current_user und Objekt übernehmen sind in der Tat Objekte und nicht IDs). Senden Sie stattdessen die IDs und beginnen Sie mit dem Laden der Objekte, wenn Perform gestartet wird.

Zum Beispiel:

Delayed::Job.enqueue(BackgroundProcess.new(current_user.id, object.id)) 

class BackgroundProcess < Struct.new(:user_id, :object_id) 
    def perform 
    @current_user = User.find(user_id) 
    @object = Object.find(object_id) 

    ... 
    end 
end 

Auf diese Weise ist das kein Problem Risiko einer Activerecord in die Datenbank Serialisierung und Sie werden die neuesten Änderungen immer geladen, wenn der Job ausgeführt wird.

+0

Vielen Dank das hat mein Problem gelöst – Tam

+0

Serialisierung des ursprünglichen Objekts ist keine schreckliche Sache zu tun. Man sollte immer eine neue Kopie während der Arbeit ziehen; Sie haben jedoch die Möglichkeit, bei Bedarf eine vorherige Kopie des Datensatzes anzuzeigen. – Nick

0

Ran in das gleiche Problem auch. Ich weiß immer noch nicht, was es verursacht, aber aus irgendeinem Grund scheint das Objekt klonen es

u = User.find 123 
u.to_yaml 
=> TypeError: wrong argument type nil (expected Data) 
u.clone.to_yaml 
=> works like normal 

Sehr frustrierend zu lösen. Wäre besser, die Ursache zu kennen, aber das könnte helfen, wenn Sie verzweifelt sind.