2010-09-08 5 views
7

Sto cercando di utilizzare delayed_job su Heroku e ottengo il seguente errore:Non può accodare gli elementi che non rispondono a svolgere - delayed_job su Heroku

Cannot enqueue items which do not respond to perform 

Sto usando il plugin http://github.com/pedro/delayed_job

I sto usando la seguente attività cron rake (cron.rake):

task :cron => :environment do 
require 'heroku'  
    puts "starting the cron job at #{Date.today}" 

    heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS']) 
    heroku.set_workers(ENV['HEROKU_APP'], 1) 

    Contact.all.each do |contact| 
     email = contact.email_today #email_today is a contact method returning email object if <= today 

     unless contact.email_today == "none" 
     puts contact.first_name 
     puts email.days 
     puts contact.date_entered 
     puts email.substituted_subject(contact,contact.colleagues) 

     # create the Contact Email object that gets created and sent 

     contact_email = ContactEmail.new 
     contact_email.contact_id = contact.id 
     contact_email.email_id = email.id 

     contact_email.subject = email.substituted_subject(contact,contact.colleagues) 
     contact_email.date_sent = Date.today 
     contact_email.date_created = Date.today 

     contact_email.body = email.substituted_message(contact, contact.colleagues) 

     contact_email.status = "sent" 

     Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email) 

     contact_email.save #now save the record 
     puts "save contact_email:" 
     puts contact_email.inspect 

     end #end unless 

    end #end do 

    heroku.set_workers(ENV['HEROKU_APP'], 0) 
    puts "set heroku workers to 0" 

end 

Questo è il programma di posta che sto usando:

class OutboundMailer < Postage::Mailer 

    def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    from  'Me <[email protected]>' 
    sent_on Date.today 

    body  :email => email 
    end 

Domanda: Perché ottengo l'errore e cosa posso fare per risolverlo?

risposta

10

Un lavoro di solito è un oggetto rubino con un metodo di "eseguire", accodamento così un mailer offrire non funziona, si dovrà creare un oggetto lavoro come questo qui sotto,

 
class SomeMailJob < Struct.new(:contact, :contact_email) 
    def perform 
    OutboundMailer.deliver_campaign_email(contact,contact_email) 
    end 
end 

Creare un file some_mail_job.rb e collocarlo in/lib

e

nel codice sopra riportato, sostituire l'istruzione di accodamento con

Delayed::Job.enqueue SomeMailJob.new(contact,contact_email)

+0

inoltre, leggere la documentazione http://github.com/pedro/delayed_job. è tutto lì –

+0

Ciao, lo farò - l'ho letto ma qualcun altro su SO ha detto di farlo come descritto, quindi non ero sicuro ... il tuo approccio è molto più chiaro, grazie. – Angela

2

Se non è necessario passare altre opzioni per ritardato :: Job.enqueue, allora questa è una soluzione più semplice:

OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

FYI delay si chiamava send_later, a seconda del ramo delayed_job e la versione .

+0

Funziona anche su heroku con gli operai così come sono? – Angela

+0

Quindi uso questo come cron con l'utilizzo ritardato: job enque del tutto? – Angela

+0

Questa è una sintassi alternativa (più breve) sulla creazione del proprio SomeMailJob e l'invio di un'istanza di esso a "Delayed :: Job.enqueue". Questo è tutto. Per poterlo utilizzare su Heroku, devi installare delayed_job nella tua app come gemma o plugin, ma dovrebbe essere tutto. – tfe