2016-10-03 2 views
0

실제 대기열 서비스로 작업을 실행하는 일부 예약 된 작업이 있습니다.레일은 단일 작업을 위해 ActiveJob 어댑터를 변경합니다.

이제 대시 보드에서 수동으로 작업을 실행하고 실행을 기다리고 컨트롤러 작업에서 일부 출력을 읽고 처리 할 수 ​​있기를 바랍니다. 일반적인 경우 관리자가 수동으로 일부 통계를 다시로드하려는 경우이며 몇 초 동안 서버를 정지시키는 것이 좋습니다.

이렇게하려면 ActiveJob 어댑터를 "인라인"으로 변경하는 방법이 있습니까? 가능한 경우이 작업에 의해 생성 된 일부 유물 (인스턴스 변수 또는 perform 작업의 반환 값일 수 있음)을 읽고 싶습니다.

그 방법은 무엇입니까?

샘플 작업 "perform_now"

내가 믿는
class TopLevelJob < ApplicationJob 
    def perform 
    some_iterator.each do 
     SomeNestedJob.rand.perform_later 
     # There are several types of sub-jobs that can be called 
     # Passing a flag param (perform vs perform_later) would be kind of annoying 
    end 
end 

module SomeNestedJob 
    class A < ApplicationJob; 
    def perform 
     # May in turn spawn an other job with perform_later 
    end 
    end 
    ... 
    class Z < ApplicationJob; ...; end 

    def self.rand 
    [A..Z].sample 
    end 
end 

답변

0

큐에 가지 않고, 바로 작업을 실행 당신을 위해 무엇을 ... 찾고 있습니다.

cf. ActiveJob on http://edgeapi.rubyonrails.org/classes/ActiveJob/Base.html

그 외, 실제로 "수행"에 플래그 ("has_whatever_output_you_have_in_mind")가 있으며 출력 수행을 위해 수행 작업에 사용하십시오.

+0

문제는 내 작업이 여러 개의 중첩 된 작업을 트리거하고 모든 중첩 된 작업의 코드를 변경하여 해당 플래그를 전달하는 것입니다. 이상적으로 현재 요청에 대한 구성을 변경하고 (이후에는 정상으로 되돌리려 고합니다) 모든 것에 대해 걱정할 필요가 없습니다. –

+0

아마도 액션을 모듈에 캡슐화하고 모듈에서 호출하려고 할 것입니다. 그러나 그것은 이전에 언급 된 것처럼 성가신 일이 될 것입니다. – Canardgarou

+0

적절한 인수 (arg [x]와 "- o"또는 "- pdf"가 일치)가있는 경우 perform_now를 사용하여 호출 할 때 출력을 트리거하는 "before"또는 "after"를 정의 할 수 있습니다. – Canardgarou