2011-07-27 5 views
9

사용자 정의 작업 클래스에서 run_at datetime을 가져 오려고합니다. 내 코드는 다음과 같습니다Delayed_Job : 작업 메타 데이터 액세스 및/또는 중복 작업 피하기

class MyCustomJob < Struct.new(:my_object) 

    def perform 
    if self.run_at == my_object.start_time 
     # process the job 
    end 
    end 

end 

내가 또한 Delayed::Job.find(self)을 시도했지만 운이 없었다. 사전에

감사

+2

을 수행합니다 ** 지연 ** :: 작업 ** AR 개체를 ** 수행 ** 방법 안에 넣고 싶습니까? – Anatoly

+0

정확히! 개체의 start_time이 변경되었는지 확인해야합니다. – Oliver

답변

8
당신이 작업 만들 때

이 처리해야합니다 :

priority = 0 
    run_time = my_object.start_time 
    Delayed::Job.enqueue(MyCustomJob.new(my_object), priority, run_time) 

https://github.com/tobi/delayed_job/wiki

당신의 작업이 예상 시간에 실행하지 않는 경우, 당신은 UTC 그들을 예약 될 수있다 :

http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/

기존 J에 대한 대기열을 확인하려면 산부인과 - 다음을 수행 할 수 있습니다 :


class MyCustomJob < Struct.new(:object_id) 

    def self.exists?(object_id) 
    Delayed::Job.where(['handler = ? and failed_at is null',handler(object_id)]).count(:all) > 0 
    end 

    def self.handler(object_id) 
    "--- !ruby/struct:MyCustomJob \nobject_id: #{object_id}\n" 
    end 

    def perform 
    my_object = MyObject.find(object_id) 
    my_object.do_stuff 
    end 
end 

가 그럼 그냥 대기 전에 MyCustomJob.exists?(my_object.id) 확인합니다.

해킹이 약간 있습니다. 필요에 따라 handler 방법을 수정하십시오. delayed_jobs 테이블을 수정하여 작업 테이블이 크거나 다른 유형의 작업에서이 작업을 수행하는 경우 더 깨끗한 코드와 더 효율적인 테이블 스캔을위한 클래스/object_id를 만들 수 있습니다.

이 질문은 관련 같습니다

How to cancel scheduled job with delayed_job in Rails?

+0

hm 나는 이미 이렇게 대기하고 있습니다. 작업이 실행될 때 start_time이 객체에서 변경되었는지 확인해야합니다. – Oliver

+0

수정 사항을 참조하십시오. . . 답장을 보내 주셔서 감사합니다. – klochner

+0

이것은 타이밍 문제가 아닙니다 .. 내가 캘린더에 이벤트를 가지고있다 .. 이벤트가 시작되기 전에 10 분 전에 미리 알림을 보내고 싶습니다. 큐에있는 작업 때문에 누군가가 이벤트를 다음날 .. 그래서 현재 작업이 유효한지 확인해야합니다. – Oliver

10

당신이 사용자 정의 작업에 방법 전에를 정의 할 경우, 작업자가 수행 호출하기 전에 당신에게 지연된 작업 인스턴스를 전달합니다 :

class MyCustomTask 

    def before(job) 
    @job = job 
    end 

    def perform 
    # has access to @job object. 
    # You may need to call @job.reload to see in-flight changes to object in the database. 
    end 
end 
관련 문제