2012-04-02 15 views
5

Ho qualche miniapp che usa delayed_job. Sul mio localhost tutto funziona bene, ma quando distribuisco la mia app su Heroku e clicco sul link che dovrebbe essere eseguito da delayed_job, quindi non succede nulla, il "task" è appena salvato nella tabella delayed_job.Heroku - come iniziare il lavoro (lavoro ritardato)?

In this article on heroku blog è scritto, che il compito da delayed_job tabella viene eseguita, quando viene eseguito questo comando lavori rastrello: funzionano.

Ma come posso eseguire questo comando? Dove dovrebbe essere posizionato il comando? Nel codice o dalla console del terminale?

risposta

11

Se si esegue lo stack cedro, eseguire il seguente dalla console terminale:

Se si esegue gli stack più grandi (di bambù, Aspen, ecc):

heroku rake jobs:work 

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

Secondo il delayed_jobdocumentation, è anche possibile avviare un lavoratore di programmazione:

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

Delayed::Worker.new.start 
+2

sì, questo funziona io. Ma come posso eseguire questa attività automaticamente dalla mia app? – user984621

+0

cosa dire quando si vuole iniziare un lavoratore quando qualcosa va in coda? devi avere un lavoratore che è in esecuzione tutto il tempo e prelevare attività dalla coda? non è così problematico con Heroku che riavvia i dynos una volta al giorno .. – Magne

+0

Se desideri che un worker esegua automaticamente le attività mentre vengono messe in coda, devi inserire il comando delayed_job nel Procfile come nuovo elabora e aggiungi almeno 1 addetto alla tua applicazione su Heroku. –

8

È necessario utilizzare un Procfile per scpecificare i comandi per i propri dynos. Per esempio si potrebbe avere qualcosa di simile nella vostra Procfile:

AppDir/Procfile

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

Per utilizzare questa sul computer di sviluppo, è necessario utilizzare Foreman, è tutto spiegato i documenti.

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

1

Nel nostro caso siamo solo l'esecuzione di un lavoro in ritardo una volta al mese, quindi non vuole avere un banco operaio costantemente in esecuzione.

Per risolvere il problema, accodiamo il lavoro (con .delayed) e quindi utilizziamo lo Heroku platform API per generare uno rake jobs:workoff in un lavoratore unico. La chiamata API ritorna relativamente velocemente.

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