Всякий раз, когда запланированная задача в Heroku с Rails

Мне нужно запустить запланированную задачу в Heroku, используя каждый раз. Моя первая работа cron в Rails! :-)

Локально он работает нормально, но как заставить его работать в Heroku?

Я пробовал это: heroku запускать всякий раз, когда --update-crontab store

но...

[ошибка] Не удалось записать crontab; попробуйте запустить `when 'без параметров, чтобы убедиться, что ваш файл расписания действителен.

Я также добавил Heroku Scheduler в свое приложение на Heroku.

Это мой config / schedule.rb

RAILS_ROOT = File.dirname(__FILE__) + '/..'
require File.expand_path(File.dirname(__FILE__) + "/environment")


every :day, :at => "11:00am" do
  @appointments = Appointment.where('date between ? and ?', Date.today, Date.today + 2.day)
  @appointments.each do |appointment|

    @emails = []

    @informated_people = InformatedPerson.where(person_id: appointment.person_id)
    @users = User.find(Authorization.where(:person_id => appointment.person_id).pluck(:user_id))
    @person = Person.find(appointment.person_id)

    @emails << @person.email

    @informated_people.each do |informated_person|
        @emails << informated_person.email
    end

    @users.each do |user|
        @emails << user.email
    end

    UserEmail.appointment_reminder_email(@emails.uniq, @person , 'Cita para el día ' + appointment.date.strftime("%d/%m/%Y %H:%M") + ' con el doctor ' + appointment.doctor + ' para la especialidad ' + appointment.specialty + ' en el centro ' + appointment.center + '.' ).deliver

  end
end

person user3402629    schedule 23.07.2014    source источник


Ответы (1)


Heroku предоставляет планировщик для таких задач (https://devcenter.heroku.com/articles/scheduler)

Планировщик - это надстройка для запуска заданий в вашем приложении через запланированные промежутки времени, во многом аналогично cron в традиционной серверной среде.

Я бы посоветовал вам переместить этот код в функцию в вашей модели встреч.

def appointments_reminder
  @appointments = Appointment.where('date between ? and ?', Date.today, Date.today + 2.day)
  @appointments.each do |appointment|

  @emails = []

  @informated_people = InformatedPerson.where(person_id: appointment.person_id)
  @users = User.find(Authorization.where(:person_id => appointment.person_id).pluck(:user_id))
  @person = Person.find(appointment.person_id)

  @emails << @person.email

  @informated_people.each do |informated_person|
      @emails << informated_person.email
  end

  @users.each do |user|
      @emails << user.email
  end

  UserEmail.appointment_reminder_email(@emails.uniq, @person , 'Cita para el día ' + appointment.date.strftime("%d/%m/%Y %H:%M") + ' con el doctor ' + appointment.doctor + ' para la especialidad ' + appointment.specialty + ' en el centro ' + appointment.center + '.' ).deliver
end

Далее вам нужно создать lib/tasks/scheduler.rake файл

desc "Heroku scheduler tasks"
task :email_appointments_reminder => :environment do
  puts "Sending out email reminders for appointments."
  Appointment.appointments_reminder
  puts "Emails sent!"
end

Наконец, с помощью веб-интерфейса вы можете запланировать его, используя имя задачи. В этом примере это rake email_appointments_reminder, и вы можете выбрать частоту из раскрывающихся опций, чтобы запускать его ежедневно в 11:00.

Я также предлагаю протестировать задачу вручную, прежде чем планировать ее, с помощью этой консольной команды: heroku run rake email_appointments_reminder

person AytanLeibowitz    schedule 24.07.2014
comment
Таааанкс Айтан, сейчас проверил и работаю в героку. :-) - person user3402629; 24.07.2014
comment
Планировщик - это услуга «с максимальной эффективностью», что означает, что выполнение ожидается, но не гарантируется. Планировщик, как известно, иногда (но редко) пропускает выполнение запланированных заданий. Если запланированные задания являются критическим компонентом вашего приложения, рекомендуется вместо этого запускать настраиваемый процесс часов для большей надежности, контроля и видимости ». (devcenter.heroku.com/articles/scheduler) - person Valentin V; 05.04.2017