sidekiq, изпращащ клас като аргументи, дава твърде дълбока грешка на нивото на стека

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

person swapab    schedule 28.03.2013    source източник


Отговори (1)


Не трябва да поставяте задание в опашка с аргументи като class object. Трябва да са прости типове, например низове, числа, хешове и масиви от тях.

За повечето класове, с изключение на специалните, които споменах и вероятно някои други, Sidekiq сериализира този параметър, за да го преобразува точно като празен хеш. Така че няма начин да се десериализира от него обратно към вашия клас.

Предлагам ви да предадете self.class.name на метода enqueue, както опитахте, и след това да използвате constantize, за да получите клас от низ.

person Flexoid    schedule 28.03.2013