2012-04-02 14 views
5

Mam niektóre miniapp, które używają delayed_job. Na moim lokalnym hoście wszystko działa dobrze, ale kiedy wdrażam moją aplikację na Heroku i klikam na link, który powinien zostać wykonany przez delayed_job, więc nic się nie dzieje, "zadanie" jest właśnie zapisane w tabeli delayed_job.Heroku - jak rozpocząć pracę zawodową (praca opóźniona)?

In this article on heroku blog jest napisane, że zadanie z delayed_job tabeli jest wykonywana, gdy prowadzony jest to polecenie pracy Zgrabiarka: pracować.

Ale jak mogę uruchomić to polecenie? Gdzie należy umieścić polecenie? W kodzie lub z konsoli terminala?

Odpowiedz

11

Jeśli używasz stosu Cedar, uruchom następujące polecenia z konsoli terminala:

Jeśli używasz starszych stosy (bambusa, osika, itd.):

heroku rake jobs:work 

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

Według delayed_jobdocumentation, można również uruchomić pracownika programowo:

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

Delayed::Worker.new.start 
+2

tak, to działa mnie. Ale jak mogę uruchomić to zadanie automatycznie z mojej aplikacji? – user984621

+0

o tym, kiedy chcesz uruchomić pracownika, gdy coś trafi do kolejki? czy musisz mieć pracownika, który cały czas działa i wybierać zadania z kolejki? nie jest tak problematyczne przy ponownym uruchamianiu dynama przez Heroku raz dziennie .. – Magne

+0

Jeśli chcesz mieć pracownika, który automatycznie uruchamia zadania, gdy są umieszczane w kolejce, musisz umieścić polecenie delayed_job w swoim pliku Procfile jako nowy Przetwórz i dodaj co najmniej 1 dyno pracownika do swojej aplikacji na Heroku. –

8

Powinieneś użyć pliku Procfile do scpecify poleceń dla swoich dynos. Na przykład można mieć coś takiego w swoim Procfile:

Appdir/Procfile

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

do korzystania z tego na jednym komputerze, należy użyć Foremana, to wszystko jest wyjaśnione w docs.

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

1

W naszym przypadku mamy tylko działa z opóźnieniem pracy raz w miesiącu, więc nie chcemy mieć dyno pracownik działa stale.

Aby rozwiązać ten problem, dodajemy do kolejki zadanie (z .delayed), a następnie używamy Heroku platform API do odrodzenia rake jobs:workoff w jednorazowym module roboczym. Wywołanie API zwraca się względnie szybko.

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