2012-04-02 6 views
5

Ich habe einige Miniapp, die delayed_job verwenden. Auf meinem localhost funktioniert alles einwandfrei, aber wenn ich meine App auf Heroku deploye und auf den Link klicke, der von delayed_job ausgeführt werden soll, so passiert nichts, der "Task" wird nur in der Tabelle delayed_job gespeichert.Heroku - wie man Job-Arbeiter (verzögerter Job) beginnt?

In this article on heroku blog geschrieben steht, dass die Aufgabe von delayed_job Tabelle ausgeführt wird, wenn diese Rake Jobs Befehl ausgeführt wird: arbeiten.

Aber wie kann ich diesen Befehl ausführen? Wo sollte der Befehl platziert werden? Im Code oder von der Terminalkonsole?

Antwort

11

Wenn Sie den Cedar-Stack ausgeführt werden, die folgenden von der Terminalkonsole auszuführen:

Wenn Sie die ältere Stapel laufen (Bambus, Aspen, etc.):

heroku rake jobs:work 

siehe: https://devcenter.heroku.com/articles/rake

nach dem delayed_jobdocumentation, können Sie auch einen Arbeiter programmatisch starten:

#!/usr/bin/env ruby 
require File.dirname(__FILE__) + '/../config/environment' 

Delayed::Worker.new.start 
+2

Ja, das funktioniert mir. Aber wie kann ich diese Aufgabe automatisch von meiner App aus ausführen? – user984621

+0

was ist, wenn Sie einen Arbeiter starten wollen, wenn etwas in die Warteschlange geht? Müssen Sie einen Mitarbeiter haben, der die ganze Zeit ausgeführt wird, und Aufgaben aus der Warteschlange auswählen? ist nicht so problematisch, wenn Heroku Dynos einmal täglich neu startet. – Magne

+0

Wenn Sie möchten, dass ein Worker Aufgaben automatisch ausführt, während sie in die Warteschlange gestellt werden, müssen Sie den Befehl "delayed_job" in Ihre Procfile einfügen Bearbeiten und fügen Sie Ihrer Anwendung auf Heroku mindestens 1 Arbeiterprüfpunkt hinzu. –

8

Sie sollten eine Procfile verwenden, um die Befehle für Ihre Dynos festzulegen. Zum Beispiel würden Sie so etwas in Ihrer procfile haben:

APPDIR/procfile

web:  bundle exec rails server -p $PORT 
worker: bundle exec rake jobs:work 

diese Maschine auf Ihrer Entwicklung zu verwenden, sollten Sie Foreman verwenden, es ist alles in der Dokumentation erklärt.

https://devcenter.heroku.com/articles/procfile

1

In unserem Fall wir laufen nur einen verzögerten Job einmal im Monat, so nicht ein Arbeiter dyno laufen ständig haben wollen.

Um dies zu lösen, stellen wir den Job in eine Warteschlange (mit .delayed) und verwenden dann Heroku platform API, um rake jobs:workoff in einem einmaligen Worker zu spawnen. Der API-Aufruf kehrt relativ schnell zurück.

PlatformAPI.connect_oauth(ENV["YOUR_HEROKU_KEY"]).dyno.create(ENV["YOUR_HEROKU_APP_NAME"],{command: 'rake jobs:workoff'})