2017-02-07 1 views
0

ich so etwas wie die folgenden haben die Warteschlange:Wie rufus-Scheduler Jobs

# myScript.rb 

require 'rufus-scheduler' 

    def loop 
    "hey I am i the loop" 
    end 

    def run_schedule(url, count, method, interval) 
    puts "running scheduler" 

    scheduler = Rufus::Scheduler.new 

    scheduler.every interval do 

    loop(url, count, method) 
    end 
    end 

    run_schedule(url, count, method, interval) 

Meine Erwartung ist, dass, wenn ich laufen:

bundle exec ruby myScript.rb url, count, method, interval 

Ich sehe Ausgabe eine Reihe von „hey STD I bin in der Schleife "basierend auf dem Intervall.

Was passiert, ist, dass ich auf die Eingabeaufforderung der Befehlszeile beenden und nie die Schleife ausführen.

+0

Ich glaube, das ist ein Tippfehler, Sie brauchen nicht das letzte "Ende". Warum hast du die "url" Methode, wenn du nicht benutzt? – MurifoX

+0

diese sind in der Befehlszeile übergeben habe ich gerade nicht explizit das ARGV aufrufen. – Angela

Antwort

1

Wie kann man

def loop 
    "hey I am i the loop" 
end 

ausgeben, etwas zu stdout erwarten (nicht STD)? Es kehrt nur eine Zeichenfolge, ist es nicht print oder puts ...

# myScript.rb 

require 'rufus-scheduler' 

def _loop(u, c, m) 
    # "loop" is a bad name, it's a Ruby keyword, so using "_loop" instead 
    # it's still a bad name 

    p "hey I am i the loop" 
    p [ Time.now, [ u, c, m ] ] 
    # without p or puts nothing gets to stdout 
end 

$scheduler = Rufus::Scheduler.new 
    # creating a single scheduler for the whole script 
    # not creating a new scheduler each time run_schedule is called 

def run_schedule(url, count, method, interval) 

    #puts "running scheduler" 
    #scheduler = Rufus::Scheduler.new 
    # commenting out... 

    $scheduler.every interval do 

    _loop(url, count, method) 
    end 
end 

#run_schedule(url, count, method, interval) 
run_schedule('url', 'count', 'method', '3s') 

$scheduler.join 
    # let the Ruby main thread join the scheduler thread so that 
    # the Ruby process does not exit and so scheduling may happen 

ruft und so geht es weiter:

"hey I am i the loop" 
[2017-02-08 06:06:01 +0900, ["url", "count", "method"]] 
"hey I am i the loop" 
[2017-02-08 06:06:05 +0900, ["url", "count", "method"]] 
"hey I am i the loop" 
[2017-02-08 06:06:08 +0900, ["url", "count", "method"]] 

Notiere die $scheduler.join am Ende des Skripts. Dies verhindert, dass der Ruby-Prozess beendet wird. Da dieser Prozess nicht existiert, leben die Threads (in unserem Fall der Thread in der rufus-Scheduler-Instanz) und erledigen ihre Arbeit. Dein erstes Skript war einfach zu beenden und gab wie erwartet alle Ressourcen frei.

+0

oh ja du hast recht mein eigentliches Skript verwendet puts, aber das Umschreiben der Abstraktion habe ich ausgeschlossen ... aber du hast das Hauptproblem, das ist der $ schedule.join ...... – Angela

+0

also denke ich, dass du mein Problem gelöst hast Ich gebe es aus! – Angela

+0

Ja! das funktioniert, danke. Ich wünschte, das wäre irgendwie in den Beispielen oder der Dokumentation gewesen. Ich hätte nicht gewusst, den $ Zeitplan zu verwenden und 'beizutreten' ..... wie hast du das anhand der Dokumentation herausgefunden? – Angela