2012-03-14 2 views
2

백그라운드에서 일부 사용자 정의 메서드를 실행하기 위해 DelayedJob을 가져 오려고했습니다. 이 테스트 케이스를 들어 내가 도우미에서 다음과 같은 방법을 정의 :Delayed_job 실행되지 않음 사용자 정의 메서드

def test_case 
    u = User.new 
    u.first_name = "JimBob" 
    u.last_name = "joe" 
    u.email = "[email protected]" 
    u.password = "sailsJ123" 
    u.password_confirmation = "sailsJ123" 
    u.save 
    end 

그런 다음 컨트롤러 액션에, 나는 정의

def action_name 
    #whatever it does outside of this 
    test_case 

    end 

이 작업이 여기에 때 새 사용자를 만들 test_case 원인 운영. 내가 작업을 지연하려고하면, 나는 그것을 변경 :이 delayed_job 원인

def action_name 
    #whatever it does outside of this 
    self.delay.test_case 
    end 

가 작성 될,하지만이 잘못을하고있어 특정 징후 : 구체적으로는 delayed_job 테이블의 핸들러는 모든 포함 이 정보는 test_name 등을 실행하도록 지정하는 단순한 처리기가 아니라 action_name (이 경우에는 약 50000 자의 매우 큰 파일)의 다른 곳에서로드됩니다. 내가 테스트를 유지하기 위해이 약을 변경하는 경우

이, 내가하고 시도 : 예상대로,

def action_name 
    #whatever it does outside of this 
    u = User.new 
    u.first_name = "JimBob" 
    u.last_name = "joe" 
    u.email = "[email protected]" 
    u.password = "sailsJ123" 
    u.password_confirmation = "sailsJ123" 
    u.delay.save 
    end 

이가 DJ를 성공적으로 생성하고, 그것은 세부 사항을 지정하는 핸들러를로드합니다 (예 : u.name => "JimBob"...). 그러나 작업이 실행될 때 새로운 사용자는 생성되지 않습니다. 심지어 암호를 필드를 처리하는 방법을 주어진 주어진 사용자 (나는 아마 DJ와 함께 사용자를 만드는 것은 어려울 수도 있지만)을 파괴하기 위해 그것을 전환하려고했지만이 작동하지 않습니다. 짧은

SO 긴 이야기 :

  1. 가 어떻게 DJ가 제대로 배경 방법을 실행할 수 있습니까?
  2. 직선적으로 보이는 지연된 작업이 생성되는 경우 데이터베이스가 변경되지 않습니다.
+0

DJ 처리기 개체 및 메서드 이름을 무엇입니까? – AMIT

+0

@AMIT 이것은 "지연된 작업"의 약자입니다. – Roshan

답변

0

이 뭔가 잘못임을 표시하지 않습니다

는 delayed_job 테이블이 다른 곳에서로드 된 모든 정보를 포함

ACTION_NAME

당신이이기 때문에이 경우 예상되는

이 말 :

self.delay.test_case 

self은 컨트롤러입니다. ens는 params이고 당신이 아마 신경 쓰지 않는 모든 종류의 다른 것들을 가지고 있습니다. DJ는 test_case에 적합한 컨텍스트를 제공하기 위해 self을 직렬화해야합니다. 아마도 큰 파일을 가지고 어딘가에 크기 제한이있는 것 같습니다. self에 갇혀있을 것입니다.

다른 두 번째 "delay에 전화하기"접근 방식이 올바른 방향으로 움직이고 있다고 생각합니다.

당신은 작업 클래스 문의 시도해 볼 수도 있습니다 :

class ItsAJob 
    def perform 
     u = User.new 
     u.first_name = "JimBob" 
     u.last_name = "joe" 
     u.email = "[email protected]" 
     u.password = "sailsJ123" 
     u.password_confirmation = "sailsJ123" 
     u.save 
    end 
end 

# and elsewhere... 
Delayed::Job.enqueue(ItsAJob.new) 

을 또는 당신이 클래스에 .delay 수 있도록 방법 수업 방법을 시도해보십시오 :

class YourController 
    def action_name 
     self.class.delay.test_case 
    end 

    def self.test_case 
     u = User.new 
     u.first_name = "JimBob" 
     u.last_name = "joe" 
     u.email = "[email protected]" 
     u.password = "sailsJ123" 
     u.password_confirmation = "sailsJ123" 
     u.save 
    end 

0

당신은 지연 할 수 DJ가 작업을 수행하기 전에 데이터베이스에서 모델을 다시로드하려고하므로 ActiveRecord 모델에 #save를 지정하십시오. 모든 데이터가 손실됩니다. 대신 User를 생성하는 #perform 메소드로 Job 클래스를 생성하십시오.

+0

정교하게 제발 할 수 있습니까? – Alex

+0

ActiveRecord 개체의 메서드를 지연 시키면 DJ가 메서드, 클래스 이름 및 ID를 큐에 씁니다. 작업이 실행되면 실제 객체는 id에 의해 데이터베이스에서로드됩니다. 새로로드되었으므로 데이터베이스에 유지되지 않는 오브젝트의 모든 상태가 유실됩니다. 이러한 방식으로 모델에 대한 업데이트를 연기하는 것은 아무 작업이 아닙니다. – betamatt

관련 문제