2013-02-13 11 views
5

私はdelayed_jobを使用するRailsアプリケーションを持っています。私はdelayed_jobプロセスにいるかどうかを検出したい。何かのように私はdelayed_jobプロセスかどうかを確認してください

if in_delayed_job? 
    # do something only if it is a delayed_job process... 
else 
    # do something only if it is not a delayed_job process... 
end 

しかし、私はどのように把握することはできません。これは私が今使っているものです:@MrDanAが言ったように

IN_DELAYED_JOB = begin 
    basename  = File.basename $0 
    arguments  = $* 
    rake_args_regex = /\Ajobs:/ 

    (basename == 'delayed_job') || 
    (basename == 'rake' && arguments.find{ |v| v =~ rake_args_regex }) 
end 

別の解決策は、次のとおりです。

$ DELAYED_JOB=true script/delayed_job start 
# And in the app: 
IN_DELAYED_JOB = ENV['DELAYED_JOB'].present? 

が、彼らは私見弱いソリューションです。誰かがより良い解決策を提案できますか?

+2

これは方法ですか?遅延ジョブからジョブが呼び出されているかどうかを示すフラグを送るのはどうですか?デフォルトではfalseに設定され、実際に遅延ジョブから呼び出されたときにのみ設定されます。あなたが他の何かを見つけることができない場合、迅速かつ簡単な解決策。 – MrDanA

+0

それは別の解決策です(私はあなたが 'DELAYED_JOB = true script/delayed_job start'を意味すると思います)。しかし、私はdelayed_jobでアプリを起動するときに変数を設定または解除することを忘れないでください。しない – mdesantis

+0

遅延ジョブの開始時にこのメソッドが自動的に実行されますか?代わりに、あなたのコードのどこかで 'user.delay.send_email'のようにしていると仮定しました。次に、その行を 'user.delay.send_email(true)'に変更することができます。ここで 'true'は遅延したジョブの一部として呼び出されていることを示します。 – MrDanA

答えて

1

私がこれらを処理する方法は、パラノイドワーカーです。私は私のサイトにアップロードされたビデオのトランスコードにdelayed_jobを使用します。ビデオのモデル内では、デフォルトで0/nullに設定されているvideo_processingというフィールドがあります。ビデオがdelayed_job(ビデオファイルの作成時または更新時)によってトランスコードされるたびに、delayed_jobからのフックが使用され、ジョブが開始されるたびにvideo_processingが更新されます。ジョブが完了したら、完成したフックは、私は多分このような何かをvideo.video_processing? ? "Video Transcoding in Progress" : "Video Fished Transcoding"

+0

私は同じ目的でdelayed_jobを使用します。トランスコードには何を使用しますか?私は 'avconv'(http://libav.org/avconv.html)用のRubyラッパーを作成しました。私のプロセスはdelayed_jobプロセスかどうかを知りたいです。 – mdesantis

+0

私は' ffmpeg'を使ってビデオをエンコードします。私は 'carrierwave'、' carrierwave-video'、 'delayed_job'、' carrierwave_backgrounder'を使って、アップロード、トランスコード、バックグラウンド処理を渡し、トランスコードのためにバックグラウンドプロセッサにアップロードを送ります。 – kobaltz

+0

私は 'carrierwave-video'の存在について知りませんでした。ありがとうございました – mdesantis

1

を行うことができます私の見解/コントローラでは0

にフィールドを更新します。あなたのクラスにフィールドを追加し、あなたが遅延のジョブからすべての作業を行うメソッドを呼び出すときにそれを設定します。

遅れの仕事から:ここで

class User < ActiveRecord::Base 
    attr_accessor :in_delayed_job 

    def queue_calculation_request 
    Delayed::Job.enqueue(CalculationRequest.new(self.id)) 
    end 

    def do_the_work 
    if (in_delayed_job) 
     puts "Im in delayed job" 
    else 
     puts "I was called directly" 
    end 
    end 

    class CalculationRequest < Struct.new(:id) 
    def perform 
     user = User.find(id) 
     user.in_delayed_job = true 
     user.do_the_work 
    end 

    def display_name 
     "Perform the needeful user Calculations" 
    end 
    end 
end 

は、それがどのように見えるかです

Worker(host:Johns-MacBook-Pro.local pid:67020)] Starting job worker 
Im in delayed job 
[Worker(host:Johns-MacBook-Pro.local pid:67020)] Perform the needeful user Calculations completed after 0.2787 
[Worker(host:Johns-MacBook-Pro.local pid:67020)] 1 jobs processed at 1.5578 j/s, 0 failed ... 
コンソールから

user = User.first.do_the_work 
    User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 101]] 
I was called directly 
+0

問題は、私がdelayed_job procss _outside_ delayed_jobメソッドにいるかどうかを知りたいということです。 – mdesantis

+0

上記のdo_the_workでは、delayed_job以外のものから入ってきた場合、in_delayed_jobはnilになります。あなたは、外出遅延雇用法の意味を広げることができますか? –

+0

申し訳ありません@JohnNaegle、私は今まであなたのコメントを見たことがありませんでした。私は間違っていました。ジョブが開始される前、つまりDelayedJobがRailsアプリケーションをブートストラップする前に、私が遅延ジョブに入っているかどうかを知る必要があると言いたいと思っていました。あなたが提案する方法は正しいが、ジョブの開始後にロードされたコードに対してのみ適切である。 – mdesantis

0

どうENV [ 'PROC_TYPE']について
のみHerokuのといえば...しかし、あなたは労働者のダイナモをしているとき、これは「労働者」に設定されている は、私が「私はDJにいるよ」

+0

ああ...あなたのWebワーカーにDJワーカーを含めるように指示した場合(なぜ2番目のWebワーカーを使用しないのでしょうか)...そのワーカーもDJを処理し、 "ワーカー" – baash05

1

これは私のために働く私のようにそれを使用します。

def delayed_job_worker? 
    (ENV["_"].include? "delayed_job") 
end 

Unixは、現在のコマンドに "_"環境変数を設定します。

"not_a_delayed_job"と呼ばれるbinスクリプトがあれば間違いでしょうが、そうしないでください。

関連する問題