След като настроих 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