2011-01-14 4 views
5

Essayer de faire la queue avec un travail delayed_job comme suit:exception bizarre avec delayed_job

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

current_user et l'objet ne sont pas nuls quand je les imprimer. La chose étrange est que parfois rafraîchir la page ou exécuter la commande fonctionne à nouveau!

Voici la trace d'exception:

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' 

Répondre

7

Je suppose qu'elle est causée par le fait que vous envoyez les objets comme arguments à vos travaux (au moins je suppose que current_user et objets sont des objets de fait et pas id). Envoyez plutôt les identifiants et commencez par charger les objets quand l'exécution commence.

Par exemple:

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 

De cette façon, il ne risque pas de problème avec une sérialisation ActiveRecord dans la base de données et vous aurez toujours charger les dernières modifications lorsque le travail est exécuté.

+0

Merci beaucoup cela a résolu mon problème – Tam

+0

Sérialiser l'objet original n'est pas une chose terrible à faire. On devrait toujours retirer une copie fraîche pendant le travail; Cependant, il vous donne la possibilité de voir une copie précédente de l'enregistrement si nécessaire. – Nick

0

Ran dans ce même problème aussi bien. Je ne sais toujours pas ce qui est à l'origine, mais pour une raison quelconque clonage l'objet semble résoudre

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

Très frustrant. Serait mieux de connaître la cause première, mais cela pourrait aider si vous êtes désespéré.