как мне использовать delayed_job на героку для отправки пакетных писем?

Я читал документацию по worker и delayed_job и не мог точно следовать ей, поэтому хотел получить фору со стратегией и примером кода.

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

Как мне начать подходить к этому? Благодарю.

Вот что я придумал на основе ответов:

Используя гем 'whenever', я создал следующий 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

Это выглядит правильно? Я разрабатываю для Windows и развертываю на героку, поэтому не знаю, как это проверить... спасибо!


person Satchel    schedule 22.08.2010    source источник


Ответы (1)


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

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

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

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

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

person theTRON    schedule 23.08.2010
comment
Могу ли я протестировать функциональность cron в своей локальной среде Windwos? Есть ли способ добавить воркеров из контроллера (вместо использования консоли)? - person Satchel; 24.08.2010
comment
Я приложил свою попытку включать и выключать рабочих для этой работы (поэтому я не продолжаю платить)... не уверен, что это правильно.... что вы думаете? - person Satchel; 24.08.2010
comment
Ознакомьтесь с отложенной вилкой заданий Педро, которая включает автоматическое масштабирование работников-героку. github.com/pedro/delayed_job/tree/autoscaling - person mark; 24.08.2010
comment
Вы бы порекомендовали это против коллективной идеи? могу ли я просто сделать это вручную, как я сделал выше, я не мог понять синтаксис автомасштабирования pedro.... - person Satchel; 24.08.2010
comment
Я получаю сообщение об ошибке: Невозможно поставить в очередь элементы, которые не отвечают на выполнение.... Мне нужно было сделать что-то особенное с UserMailer? Это просто обычный почтовик, которым я пользуюсь синхронно.... - person Satchel; 08.09.2010