2010-09-08 5 views
7

Je suis en train d'utiliser delayed_job sur Heroku et je reçois l'erreur suivante:Ne peut pas enqueue articles qui ne répondent pas à effectuer - delayed_job sur Heroku

Cannot enqueue items which do not respond to perform 

J'utilise le plugin http://github.com/pedro/delayed_job

I je utilise la tâche de râteau cron suivant (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 

C'est le logiciel de messagerie J'utilise:

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 

Question: Pourquoi ai-je l'erreur et que puis-je faire pour la résoudre?

Répondre

10

Un travail est généralement un objet rubis avec une méthode « exécuter », mise en attente ainsi un logiciel de messagerie livrer ne fonctionnera pas, vous devrez créer un objet métier comme celui-ci ci-dessous,

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

Créer un fichier some_mail_job.rb et placer dans/lib

et

dans le code ci-dessus, remplacez l'instruction enqueue avec

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

+0

également, lisez la documentation http://github.com/pedro/delayed_job. Tout est là –

+0

Salut, fera - je l'ai lu mais quelqu'un d'autre sur SO dit de le faire comme décrit donc n'était pas sûr .... votre approche est beaucoup plus claire, merci. – Angela

2

Si vous n'avez pas besoin de passer d'autres options pour Retardé :: Job.enqueue, alors c'est une solution plus simple:

OutboundMailer.delay.deliver_campaign_email(contact,contact_email) 

Pour votre information delay autrefois appelé send_later, en fonction de votre branche delayed_job et la version .

+0

Est-ce que thsi travaille aussi sur heroku avec les travailleurs comme ça? – Angela

+0

Donc je l'utilise comme cron avec l'utilisation retardée: job enque tout à fait? – Angela

+0

Il s'agit d'une syntaxe alternative (plus courte) permettant de créer votre propre SomeMailJob et d'en envoyer une instance à 'Delayed :: Job.enqueue'. C'est tout. Pour l'utiliser sur Heroku, vous devez installer delayed_job dans votre application en tant que gem ou plugin, mais cela devrait être tout. – tfe

Questions connexes