Странное исключение с delayed_job - PullRequest
5 голосов
/ 14 января 2011

Попытка поставить в очередь задание с delayed_job следующим образом:

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

current_user и object не равны nil, когда я их распечатываю. Странно то, что иногда обновление страницы или повторное выполнение команды работает!

Вот трассировка исключения:

  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'

Ответы [ 2 ]

7 голосов
/ 14 января 2011

Я полагаю, что это вызвано тем, что вы отправляете объекты в качестве аргументов на работу (по крайней мере, я предполагаю, что current_user и object на самом деле являются объектами, а не идентификаторами). Вместо этого отправьте идентификаторы и начните с загрузки объектов, когда начнется выполнение.

Например:

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

Таким образом, не возникает никаких проблем с сериализацией ActiveRecord в базу данных, и вы всегда будете загружать последние изменения при запуске задания.

0 голосов
/ 15 февраля 2012

Столкнулся и с этой же проблемой.Я до сих пор не знаю, что является причиной этого, но по какой-то причине клонирование объекта, кажется, решает его

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

Очень расстраивает.Было бы лучше узнать основную причину, но это может помочь, если вы в отчаянии.

...