Когда я планирую свою отложенную работу, я делаю это обычным образом:
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 использовать сериализованные данные аргументов?