2013-02-13 8 views
5

Ich habe eine Rails App, in der ich delayed_job verwende. Ich möchte erkennen, ob ich in einem delayed_job-Prozess bin oder nicht; etwas wiePrüfe ob ich in einem delayed_job Prozess bin oder nicht

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 

Aber ich kann nicht herausfinden, wie. Dies ist, was ich verwende jetzt:

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 

Eine andere Lösung ist, wie @MrDanA sagte:

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

aber sie sind IMHO schwache Lösungen. Kann jemand eine bessere Lösung vorschlagen?

+2

Ist das eine Methode? Was ist mit dem Senden eines Flags, um anzuzeigen, ob der Job von verzögertem Job aufgerufen wird oder nicht. Es kann einfach auf "false" gesetzt werden und nur dann gesetzt werden, wenn es von einem verzögerten Job aus aufgerufen wird. Schnelle und einfache Lösung, wenn Sie nichts anderes finden können. – MrDanA

+0

Ja, das ist eine andere Lösung (ich denke du meinst "DELAYED_JOB = true script/delayed_job start"), aber ich denke es ist auch eine schwache Lösung, weil ich daran denken muss, die Variable zu setzen oder zu deaktivieren, wenn ich die App mit delayed_job oder starte nicht – mdesantis

+0

Wird diese Methode automatisch ausgeführt, wenn der verzögerte Job gestartet wurde? Ich nahm an, dass du stattdessen so etwas machst: 'user.delay.send_email' irgendwo in deinem Code. Dann könnten Sie diese Zeile in 'user.delay.send_email (true)' ändern, wobei '' 'bedeutet, dass es als Teil eines verzögerten Jobs aufgerufen wird. – MrDanA

Antwort

1

Die Art, wie ich damit umgehe, ist durch einen paranoiden Arbeiter. Ich benutze delayed_job für Video Transcoding, das auf meine Seite hochgeladen wurde. Innerhalb des Modells des Videos habe ich ein Feld namens video_processing, das standardmäßig auf 0/null gesetzt ist. Jedes Mal, wenn das Video durch den delayed_job transcodiert wird (egal ob beim Erstellen oder Aktualisieren der Videodatei), verwendet es die Hooks von delayed_job und aktualisiert die video_processing bei jedem Start des Jobs. Sobald der Auftrag abgeschlossen ist, wird die fertig gestellte Haken Sie das Feld aktualisieren, um 0.

Meiner Ansicht/Controller ich video.video_processing? ? "Video Transcoding in Progress" : "Video Fished Transcoding" tun kann

+0

Ich benutze delayed_job für die gleichen Zwecke; Was verwendest du für die Transkodierung? Ich habe einen Ruby-Wrapper für 'avconv' geschrieben (http://libav.org/avconv.html). Mein Problem ist ein anderer: Ich möchte wissen, ob mein Prozess der delayed_job-Prozess ist. – mdesantis

+0

Ich benutze' ffmpeg', um die Videos zu kodieren . Ich verwende "carrierwave", "carrierwave-video", "delayed_job" und "carrierwave_backgrounder", um den Upload, die Transkodierung, die Hintergrundverarbeitung und das Hochladen des Uploads an den Hintergrundprozessor für die Transcodierung zu übertragen. – kobaltz

+0

Ich wusste nichts über die Existenz von 'carrierwave-video', danke – mdesantis

1

Vielleicht so etwas wie dieses. Fügen Sie ein Feld Ihrer Klasse und setzen Sie es, wenn Ihr invoke die Methode, die alle Ihre Arbeit von verzögerten Job macht:

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 

Hier ist, wie es aussieht:

Von Delayed Job:

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 ... 

der Konsole

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

Das Problem ist, dass ich wissen will, ob ich in einem delayed_job procss _outside_ die Methode delayed_job ... bin – mdesantis

+0

In do_the_work oben wäre in_delayed_job Null, wenn Sie von etwas anderem als delayed_job kamen. Können Sie erweitern, was Sie mit "Outside Delayed Job Method" meinen? –

+0

Sorry @JohnNaegle, ich habe Ihren Kommentar bisher nicht gesehen. Ich habe mich geirrt, ich wollte sagen, dass ich wissen muss, ob ich in einem verzögerten Job bin, bevor der Job gestartet wird, wenn DelayedJob die Rails-App bootet, weil ich sie in einem Rails-Initialisierer verwenden muss. Die von Ihnen vorgeschlagene Methode ist korrekt, eignet sich jedoch nur für den Code, der nach dem Start des Jobs geladen wird. – mdesantis

0

Wie wäre es ENV [ 'PROC_TYPE']
nur von Heroku Speaking ... aber wenn man einen Arbeiter dyno sind, dann ist diese Option auf ‚Arbeitnehmer‘ Ich benutze es als meine „ich in einem DJ bin“

+0

Oh ... auch, wenn du deinen Web-Arbeiter gegabelt hast, um einen DJ-Arbeiter einzubeziehen (warum nicht den zweiten Web-Arbeiter benutzen) ... Nun, dieser Arbeiter bearbeitet auch DJ's und hat env auf "Arbeiter" eingestellt – baash05

1

Dies funktioniert für mich:

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

Unix wird die Umgebungsvariable "_" auf den aktuellen Befehl setzen.

Es wird falsch sein, wenn Sie ein Bin-Skript namens "not_a_delayed_job" haben, aber tun Sie das nicht.

Verwandte Themen