sidekiq perform_async中的默认参数

时间:2018-03-21 11:54:31

标签: ruby-on-rails ruby sidekiq

我需要访问sidekiq作业中的current_user。一种方法是在perform_async中传递current_user,但是因为在很多地方需要它,我想默认添加它。

所以我添加了一个服务器中间件,它将获取current_user登录并在Thread.current中设置它,这是我的中间件

class SidekiqServerMiddleware

  def call(_worker, job, _queue)
    set_current_user(job['args'])
    yield
  end

  private
  def set_current_user(args)
    last_arg = args.last
    return unless last_arg.is_a?(Hash) && last_arg.key?('current_user')
    RequestStore.store[:current_user] = last_arg['current_user']
  end
end

我正在使用RequestStore以线程安全的方式设置Thread.current。

但是现在我要在perform_async调用中传递current_user。我正在为sidekiq寻找一种开箱即用的方法,但找不到任何方法。

实现此目的的一种方法是为Sidekiq :: Worker

创建自定义模块
module CustomSidekiqWorker
  include Sidekiq::Worker
  before_action set_current_user, only: :perform_async

  def set_current_user
    RequestStore.store[:current_user] = current_user.login
  end
end

然后不包括Sidekiq::Worker,而是包含CustomSidekiqWorker。有更简洁的方法吗?也许我缺少一些ruby元编程。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您需要一个客户端/服务器中间件对,而不仅仅是服务器端。

https://github.com/mperham/sidekiq/wiki/Middleware