2017-12-18 6 views
1

지연된 작업을 사용하여 대기열에 일부 이메일을 추가하고 있습니다. 작업을 만드는 방법은 다음과 같습니다.지연된 작업에서 생성 된 작업의 ID 가져 오기

EventNotifications.reminder("email", "name", id).deliver_later 

여기서 EventNotifications는 클래스이며 미리 알림은 그 안에있는 메서드입니다.

이 작업은 delayed_jobs 테이블에서 작업을 생성하지만 업데이트하려는 delayed_jobs 테이블 내에 사용자 정의 필드가 있으므로 생성 된 작업의 ID를 가져 오려고합니다. 나는 현재 위의 라인을 실행 한 후 얻을 무엇

은 다음과 같습니다

#<ActionMailer::DeliveryJob:0x00000005eb22d8 @arguments=["EventNotifications", "reminder", "deliver_now", "email", "name", 12], @job_id="6a549235-e8c1-407b-ac75-be8736559eaa", @queue_name="mailers"> 

이 제작 한 작업의 ID를 가지고 있지 않습니다. 그 이드를 어떻게 얻습니까?

+0

Rails 4.2에 있고 Rails 5가 아니기 때문에'.provider_job_id'를 아직 사용할 수 없습니다. 그러나 당신은 [이 "해킹"]을 확인할 수 있습니다 (https://stackoverflow.com/questions/29855768/rails-4-2-get-delayed-job-id-from-active-job) –

+0

개체 ID가 필요한지 또는 노동자 ID? –

+0

@Jay 감사합니다. 당신의 대답을 살펴 보겠습니다. – Yesha

답변

1

ActiveJob을 우회하여 DelayedJob API를 직접 사용할 수 있습니다. 이것은 직업 시스템을 추상화하지 않는 단점이 있습니다. 당신이 job.id에 액세스 할 수 있습니다, 그 시점에서

job = EventNotifications.delay.reminder("email", "name", id) 

: 당신이 뭔가를 할 수 있습니다.

+0

이 방법은 저에게는 효과적입니다. 그러나 이것으로 무엇을 의미하는지 설명해주십시오 : "이것은 당신의 직업 시스템을 추상화하지 않는 단점이 있습니다" – Yesha

+0

ActiveJob을 사용하면 특정 작업 백엔드와 연결되지 않는 방식으로 코드를 작성할 수 있습니다. 예를 들어, 지금 delayed_job을 사용하고 있다면 나중에 resque (다른 작업 백엔드)로 전환 할 수 있습니다. ActiveJob을 사용하면이 작업이 매우 쉽습니다. 내가 준 코드를 사용하면 다시 이동하여 resque로 전환 할 때 코드를 변경해야합니다. –