在 rails 4.2 之后,添加了 activejob, 给后台任务 gem 设定的统一的接口. 使用 activejob 时,返回的是它自己的 job id,是与 sidekiq 无相关的 job id,可以通过下面的 log 看出。
# rails console
Enqueued SearchJob (Job ID: 77819ccc-01ec-4fee-8854-b47743fee02c) to Sidekiq(glirid) with arguments: 2
=> #<SearchJob:0x007f8db0874980 @arguments=[2], @job_id="77819ccc-01ec-4fee-8854-b47743fee02c", @queue_name="glirid">
与此同时,sidekiq 输出的 log
2015-09-16T01:51:24.607Z 26003 TID-ox5kq0hms SearchJob JID-a780d064a435187572e6d575 INFO: start
在 activejob 5.0 中可以通过provider_job_id 来获取。但在 activejob 4.2.4 以下的版本并没有直接的方法可以获取。
下面将以 sidekiq 为例,为 activejob 添加 provider_job_id 获取 real job id.
# config/initializers/active_job.rb
ActiveJob::Base.class_eval do
attr_accessor :provider_job_id
end
# config/initializers/active_job_sidekiq.rb
class ActiveJob::QueueAdapters::SidekiqAdapter
class << self
def enqueue_with_provider_job_id(job)
job.provider_job_id = enqueue_without_provider_job_id(job)
end
def enqueue_at_with_provider_job_id(job, timestamp)
job.provider_job_id = enqueue_at_without_provider_job_id(job, timestamp)
end
alias_method_chain :enqueue, :provider_job_id
alias_method_chain :enqueue_at, :provider_job_id
end
end
把以上两个文件放在 config/initializers
中将会给 activejob 添加了 provider_job_id
方法获取 real job id, 可通过下面的 log 看出效果。
Enqueued SearchJob (Job ID: 86a55bc5-2d6f-409a-9a50-aa4bf9996659) to Sidekiq(glirid) with arguments: 2
=> #<SearchJob:0x007f8daf42a650 @arguments=[2], @job_id="86a55bc5-2d6f-409a-9a50-aa4bf9996659", @provider_job_id="af5c0ed24a7a6c45ec77e640", @queue_name="glirid">
与此同时,sidekiq 输出的 log
2015-09-16T02:06:01.117Z 26003 TID-ox5kq0hms SearchJob JID-af5c0ed24a7a6c45ec77e640 INFO: start