Действие контроллера вызывает TextMailer.contact(fg, mailing).deliver_now
, однако его необходимо перевести в фоновое задание в определенное время с помощью гем resque-scheduler.
Таким образом, действие контроллера теперь будет вызывать:
Resque.enqueue_at(@time, DelayedMailer, @fg.id, @mailing.id)
с Resque поставлена новая задача rake...
task "resque:setup" => :environment do
Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml")
ENV['QUEUES'] = *
end
запустить задание delayed_mailer
class DelayedMailer
@queue = :mail
def self.perform(time, fg_id, mailing_id)
fg = Fg.where('id = ?', fg_id).first
mailing = Mailing.where('id = ?', mailing_id).first
TextMailer.contact(fg, mailing).deliver_now
end
Есть два синтаксических элемента, которые нуждаются в уточнении.
1) должен ли метод выполнения вызывать значение времени (это кажется нелогичным, поскольку вызов Resque с enqueue_at
явно дает ключ времени, который неявно не нужно повторять)?
2) можно ли вызвать метод ActionMailer без дальнейших изменений, как он работал раньше, или очередь каким-то образом прерывает какую-то логику?
resque-scheduler
github определяет enqueue_at, она не указывает, нужно ли вызывать исходный вызов во время вperform
(я предполагаю, что нет потому что задание уже сохранено в этот момент, очередь с задержкой сохраняется в Redis и сохраняется). - person Jerome   schedule 06.09.2018