2016-10-03 11 views
0

実際のキューサービスでジョブを実行するいくつかのスケジュールされたタスクがあります。1つのジョブに対して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

関連する問題