Почему отложенное задание не загружает мои сериализованные аргументы из БД?

Когда я планирую свою отложенную работу, я делаю это обычным образом:

NotificationMailer.delay.notify(self, @current_user)

И если я загляну в объект в очереди Delayed::Job (до того, как его увидит воркер), я смогу увидеть свой сериализованный параметр current_user в обработчике:

[33] my_project »  Delayed::Job.first
  Delayed::Backend::ActiveRecord::Job Load (0.7ms)  SELECT "delayed_jobs".* FROM "delayed_jobs" ORDER BY "delayed_jobs"."id" ASC LIMIT 1
=> #<Delayed::Backend::ActiveRecord::Job:0x0000010d546fb0> {
          :id => 764161,
    :priority => 0,
    :attempts => 0,
     :handler => "--- !ruby/object:Delayed::PerformableMailer\nobject: !ruby/class 'SurveyCompletionNotificationMailer'\nmethod_name: :notify\nargs:\n- !ruby/ActiveRecord:MyInstance\n  attributes:\n    id: 10786\n   created_at: 2013-12-19 03:52:21.082910000 Z\n    updated_at: 2014-07-23 19:12:27.967755000 Z\n  delta: true\n- !ruby/ActiveRecord:User\n  attributes:\n    id: 30\n    first_name: Andrew\n    last_name: Anderson\n    created_at: 2013-01-16 16:40:20.980147000 Z\n    updated_at: 2013-01-16 16:40:20.980147000 Z\n    title: Compensation Analyst\n    primary_phone_number: '123456789'\n    supervisor_id: \n    status: modified\n    disabled: \n    prefix: \n    suffix: ''\n    department: ''\n    general_info: ''\n    contact_id: 4428\n    emulating: true\n",
  :last_error => nil,
      :run_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00,
   :locked_at => nil,
   :failed_at => nil,
   :locked_by => nil,
       :queue => nil,
  :created_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00,
  :updated_at => Wed, 23 Jul 2014 14:12:27 CDT -05:00
}

Но я обнаружил, что отложенная работа будет игнорировать сериализованные данные аргумента и перезагружать запись пользователя из базы данных. Таким образом, если запись пользователя изменяется между моментом постановки задания в очередь и временем его выполнения, будут использоваться новые данные. Это не то, чего я хочу. Зачем даже беспокоиться о сериализации параметров, если вы не собираетесь их использовать? Я что-то упускаю? Есть ли способ заставить DJ использовать сериализованные данные аргументов?


person Daiku    schedule 23.07.2014    source источник


Ответы (1)


Это поведение DJ, он просто использует десериализованный идентификатор для загрузки объекта ActiveRecord из БД (здесь находится соответствующая запись часто задаваемых вопросов). Если вы хотите, чтобы он делал что-то другое, вам нужно либо обезьянапатчить ActiveRecord, либо передать атрибуты в качестве дополнительных параметров почтовой программе.

person rabusmar    schedule 23.07.2014
comment
НЕ тот ответ, который я хотел, но я полагаю, что должен принять его, поскольку он кажется правильным. - person Daiku; 24.07.2014