2

设置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)

我发现参数在传递给工作人员之前已被序列化,但我无法弄清楚这种情况。

这是我的工人班

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

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

1 回答 1

3

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

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

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

于 2013-03-28T13:05:47.690 回答