Rails 通过 ActiveJob 获取 real job id (Sidekiq)

fumesy · 2015年09月16日 · 最后由 fumesy 回复于 2015年09月16日 · 3242 次阅读

问题

在 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

如何获取 sidekiq 的 job id

在 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

ActiveJob 提供的功能有限,即便是使用 Rails 4.2, 也会使用 Sidekiq, 不会使用 AcitveJob

#1 楼 @kingwkb ActiveJob 功能虽然功能有限,但更易用。比如:

class ActiveJobPlus < ActiveJob::Base
   queue_as  :plus  
   #before_enqueue do |job|
   #end   
   #after_enqueue do |job|
   #end
   #before_enqueue do |job|
   #end
   #before_perform do |job|
   #end
  #after_perform do |job|
  #end
end

class YourJob < ActiveJobPlus
    def perform(args)
    end
end

这样可以对共通部分进行处理。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号