2011-01-14 15 views
5

Tratando de cola un trabajo con delayed_job de la siguiente manera:excepción extraña con delayed_job

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

current_user y el objeto no son nulas al imprimirlo a cabo. ¡Lo extraño es que a veces refrescar la página o ejecutar el comando otra vez funciona!

Aquí es la traza excepción:

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' 

Respuesta

7

yo supongo que es causada por el hecho de que se envían los objetos como argumentos a sus puestos de trabajo (al menos supongo que current_user y el objeto están en los objetos de datos y no id's). Envíe los id en su lugar y comience con la carga de los objetos cuando comience la ejecución.

Por ejemplo:

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 esta manera, no se arriesga ningún problema con la serialización de un ActiveRecord en la base de datos y siempre se cargará los últimos cambios cuando se ejecuta el trabajo.

+0

Muchas gracias, esto solucionó mi problema – Tam

+0

Serializar el objeto original no es algo terrible de hacer. Uno siempre debe retirar una copia nueva mientras está en el trabajo; sin embargo, le da la opción de ver una copia previa del registro si es necesario. – Nick

0

Se metió en este mismo problema también. Todavía no sé qué lo está causando, pero por alguna razón clonar el objeto parece resolverlo

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

muy frustrante. Sería mejor saber la causa raíz, pero esto podría ayudar si estás desesperado.

Cuestiones relacionadas