2010-08-22 3 views
1

Я прочитал документацию о рабочих и задержанных_job и не мог точно следовать, поэтому хотел получить начальную стратегию и образец кода.Как использовать delayed_job на heroku для отправки отправленных писем?

У меня есть контроллер, который я использую для отправки писем один за другим. Теперь каждый день я хочу проверить, какие письма нужно отправить за день, а затем отправить их через героку как delayed_job.

Как мне приблизиться к этому? Благодарю.

Это то, что я придумывая на основе ответов:

Использование «при» драгоценный камень, я создал следующий schedule.rb

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 

Чтобы определить, должен ли я отправьте электронное письмо сегодня или нет, я создал метод для 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 

Справедливо ли это? Я занимаюсь разработкой на окнах и развертыванием на героку, так что не знаю, как его протестировать ... спасибо!

ответ

3

Если вы отправляете электронные письма один раз в день, вы, вероятно, захотите начать с добавления cron addon в свое приложение, которое будет запускать рейк-задачу раз в день.

Очевидно, что вам также необходимо добавить плагин delayed_job (http://docs.heroku.com/delayed-job). Кроме того, в вашем приложении должен быть хотя бы один рабочий.

Тогда это всего лишь вопрос выполнения вашей почтовой работы из вашей задачи cron rake. Например, если у вас есть почтовая программа под названием «UserMailer», ваш хрон может выглядеть примерно так:

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

Если вы используете только фоновые задачи, чтобы отправить эти письма, вероятно, можно также добавить некоторую логику в вашем cron, а также методы вашей почтовой программы для добавления и удаления работников по мере необходимости, что избавит вас от необходимости платить за работников, пока они не используются.

+0

Могу ли я проверить функциональность cron на моей локальной среде windwos? Есть ли способ добавить работников из контроллера (против использования консоли)? – Angela

+0

Я поставил свою попытку включить и выключить рабочих для этой работы (поэтому я не плачу) ... не уверен, правильно ли это ... что вы думаете? – Angela

+0

Посмотрите на вилку с отложенной работой Педро, которая включает в себя автоматическое масштабирование рабочих герою. http://github.com/pedro/delayed_job/tree/autoscaling – mark