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