sidekiqを設定した後、Sidekiq::Client.push
メソッドに渡される引数に関して奇妙な動作を観察しました
self.class
引数として与えると、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