sidekiq发送类作为args给stacklevel太深的错误

时间:2013-03-28 11:18:22

标签: ruby-on-rails ruby ruby-on-rails-3.2 sidekiq

设置sidekiq后,我发现传递给Sidekiq::Client.push方法的参数有一个奇怪的行为

如果我将self.class作为args,那么我要么得到一个SystemStackError (stack level too deep),要么服务器挂断,之后不接受任何请求。

Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class)

SystemStackError (stack level too deep):
  actionpack (3.2.12) lib/action_dispatch/middleware/reloader.rb:70


  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.0ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194@restro/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (37.8ms)

但是如果我给self.class.name那么它没有任何缺陷。 Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class.name)

我发现args在传递给worker之前是序列化的,但我无法弄清楚这种情况。

这是我的工人阶级

class ActivityWorker
  include Sidekiq::Worker
  sidekiq_options queue: 'high', retry: false

  def perform(res_id, res_class)
    # do some activity
  end
end

1 个答案:

答案 0 :(得分:3)

您不应该使用类对象之类的参数来排队作业。它应该是简单的类型,例如字符串,数字,哈希和它们的数组。

对于大多数类,除了我提到的加密类以及其他一些类,Sidekiq将此参数序列化为redis,就像空哈希一样。因此,无法将其反序列化回到您的班级。

我建议您在尝试时将self.class.name传递给enqueue方法,然后使用constantize从字符串中获取类。