Мой вопрос довольно прост.
Используя пользовательский класс, я могу сделать это:
class Job
def message=(message)
@message = message
end
def perform
puts @message
end
end
job = Job.new
job.message = 'hello'
Delayed::Job.enqueue job
Delayed::Job.last.invoke_job
# hello
# => nil
При использовании класса ActiveJob::Base
я не могу:
job = MyJob.new
class MyJob < ApplicationJob
def message= (message)
@message = message
end
def perform(*args)
puts @message
end
end
job = MyJob.new
job.message = 'hello'
job.enqueue
Delayed::Job.last.invoke_job
# Performed MyJob (Job ID: a8cadf34-f7f7-406d-abcf-cd96589acdf2) from DelayedJob(default) in 3.58ms
# => nil
И причина в том, что JobWrapper
, который не содержит пользовательских атрибутов, вставляется в таблицу вместо самого экземпляра задания:
Delayed::Backend::ActiveRecord::Job Create (0.5ms) INSERT INTO "delayed_jobs" ("handler", "run_at", "queue", "created_at", "updated_at") VALUES ('--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper
job_data:
job_class: MyJob
job_id: a8cadf34-f7f7-406d-abcf-cd96589acdf2
provider_job_id:
queue_name: default
priority:
arguments: []
executions: 0
locale: en
', '2018-10-23 16:34:58.363428', 'default', '2018-10-23 16:34:58.363570', '2018-10-23 16:34:58.363570') RETURNING "id"
Мне известен синтаксис perform_later
и другие относительные детали, пожалуйста, не говорите мне «Вы просто используете это неправильно» .
Это намеченное поведение или это запрещено?Если нет, есть ли обходной путь?