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)


Вы не должны ставить задание в очередь с такими аргументами, как объект класса. Это должны быть простые типы, например строки, числа, хеши и их массивы.

Для большинства классов, за исключением упомянутых мной специальных и, возможно, некоторых других, Sidekiq сериализует этот параметр в redis так же, как пустой хэш. Таким образом, невозможно десериализовать его обратно в ваш класс.

Я предлагаю вам передать self.class.name методу enqueue, как вы пытались, а затем использовать constantize для получения класса из строки.

person Flexoid    schedule 28.03.2013