设置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
答案 0 :(得分:3)
您不应该使用类对象之类的参数来排队作业。它应该是简单的类型,例如字符串,数字,哈希和它们的数组。
对于大多数类,除了我提到的加密类以及其他一些类,Sidekiq将此参数序列化为redis,就像空哈希一样。因此,无法将其反序列化回到您的班级。
我建议您在尝试时将self.class.name
传递给enqueue
方法,然后使用constantize
从字符串中获取类。