2013-03-28 2 views
1

를 제공, 나는 그때 나는 SystemStackError (stack level too deep)을 얻을 중, self.class 등의 인수를 줄 경우 Sidekiq::Client.push 방법sidekiq 전송 클래스 <a href="http://mperham.github.com/sidekiq/" rel="nofollow">sidekiq</a>을 설정 한 후 stacklevel에게 너무 깊이 오류

에 전달되는 인수에 대한 이상한 행동을 관찰 또는 서버가 끊기고 나서 아무런 요청도받지 않습니다.

SystemStackError (stack level too deep): 
    actionpack (3.2.12) lib/action_dispatch/middleware/reloader.rb:70 


    Rendered /usr/local/rvm/gems/[email protected]/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms) 
    Rendered /usr/local/rvm/gems/[email protected]/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.0ms) 
    Rendered /usr/local/rvm/gems/[email protected]/gems/actionpack-3.2.12/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (37.8ms) 

Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class)

하지만 self.class.name을 주면 그것은 어떤 결함없이 작동합니다. Sidekiq::Client.enqueue(ActivityWorker, self.id, self.class.name)

args는 작업자에게 전달되기 전에 일련 화되지만이 시나리오를 파악할 수 없습니다.

여기 내 작업자 클래스 클래스 객체와 같은 인수

class ActivityWorker 
    include Sidekiq::Worker 
    sidekiq_options queue: 'high', retry: false 

    def perform(res_id, res_class) 
    # do some activity 
    end 
end 

답변

3

당신은해야하지 인큐 일이다. 문자열, 숫자, 해시 및 배열과 같은 간단한 유형이어야합니다.

대부분의 수업에서, 제가 언급 한 것과 다른 일부를 제외하고, Sidekiq는이 매개 변수를 빈 해시처럼 redis에 직렬화합니다. 따라서 다시 그것을 비 순차화할 수 없습니다.

난 당신이 문자열에서 클래스를 얻을 수 constantize를 사용하여 다음 시도로 enqueue 방법에 self.class.name을 통과하고하는 것이 좋습니다.