2

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
4

1 に答える 1

3

クラスオブジェクトのような引数でジョブをエンキューしないでください。文字列、数値、ハッシュ、およびそれらの配列などの単純な型である必要があります。

ほとんどのクラスでは、私が言及した特別なものとおそらく他のクラスを除いて、Sidekiq はこのパラメーターを空のハッシュと同じように redis にシリアル化します。したがって、それからクラスに逆シリアル化する方法はありません。

self.class.name試したとおりにメソッドに渡し、文字列からクラスを取得するためにenqueue使用することをお勧めします。constantize

于 2013-03-28T13:05:47.690 に答える