2010-08-22 21 views
1

J'ai lu la documentation sur les workers et delayed_job et je n'ai pas pu suivre exactement, donc j'ai voulu prendre de l'avance avec une stratégie et un exemple de code.Comment puis-je utiliser delayed_job sur heroku pour envoyer des e-mails qui sont groupés?

J'ai un contrôleur que j'utilise pour envoyer des courriels un par un. Maintenant, chaque jour, je veux vérifier quels e-mails doivent être envoyés pour la journée, puis les envoyer par heroku comme un travail retardé.

Comment commencer à aborder cela? Merci.

C'est ce que je viens avec à partir des réponses:

Utilisation de la « chaque fois que » bijou, j'ai créé le schedule.rb suivant

every 1.day, :at => '4:30 am' do 

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

    Contact.all.each do |contact| 
     contact_email = contact.email_today 

     unless contact.email_today == "none" 
     puts contact.first_name 
     puts contact_email.days 
     puts contact.date_entered 

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

    end 

    heroku.set_workers(ENV['HEROKU_APP'], 0) 
    end 

Pour déterminer si je devrais envoyer un email aujourd'hui ou pas, j'ai créé la méthode pour contact.rb:

def email_today 

    next_event_info = self.next_event_info # invokes method for contact 

    next_event = next_event_info[:event] 
    delay = next_event_info[:delay] 

    if next_event.class.name == "Email" && from_today(self, next_event.days) + delay < 0 #helper from_today 
     return next_event  
    else 
     return "none" 
    end 

    end 

Est-ce que cela vous semble exact? Je suis en train de développer sur windows et de déployer à heroku alors je ne sais pas comment le tester ... merci!

Répondre

3

Si vous envoyez des emails une fois par jour, vous voudrez probablement commencer par ajouter le cron addon à votre application, ce qui déclenchera une tâche de rake une fois par jour.

De toute évidence, vous devrez également ajouter le plugin delayed_job (http://docs.heroku.com/delayed-job). En outre, votre application doit exécuter au moins un agent.

Ensuite, il suffit de faire votre travail de courrier à partir de votre tâche cron rake. Par exemple, si vous aviez un logiciel de messagerie appelé « UserMailer », votre Cron pourrait ressembler à ceci:

#lib/cron.rb 
task :cron => :environment do 
    User.all.each do |user| 
    Delayed::Job.enqueue UserMailer.deliver_notification(user) 
    end 
end 

Si vous utilisez seulement des tâches d'arrière-plan pour envoyer ces e-mails, vous pouvez probablement ajouter aussi une certaine logique dans votre tâche cron, et vos méthodes mailer pour ajouter et supprimer des travailleurs au besoin, ce qui vous évitera de devoir payer pour les travailleurs alors qu'ils ne sont pas utilisés.

+0

Puis-je tester la fonctionnalité cron de mon environnement local de windwos? Existe-t-il un moyen d'ajouter des travailleurs depuis le contrôleur (par rapport à l'utilisation de la console)? – Angela

+0

J'ai mis ma tentative d'allumer et d'éteindre les travailleurs pour ce travail (donc je ne continue pas à payer) ... je ne sais pas si c'est juste ... qu'en pensez-vous? – Angela

+0

Découvrez la fourchette de travail retardée de Pedro, qui inclut les travailleurs d'heroku à échelle automatique. http://github.com/pedro/delayed_job/tree/autoscaling – mark