Действие контроллера вызывает TextMailer.contact(fg, mailing).deliver_now
, однако его необходимо перенести в фоновое задание в определенное время с помощью gem resque-scheduler.
Таким образом, действие контроллера теперь будет вызывать:
Resque.enqueue_at(@time, DelayedMailer, @fg.id, @mailing.id)
новое задание рейка установлено с помощью Resque ...
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) должен ли метод execute вызывать значение времени (он кажется нелогичным, поскольку вызов Resque с помощью enqueue_at
явно дает ключ времени, который неявно не нужно повторять)?
2) можно ли вызывать метод ActionMailer без дальнейших изменений, как это было раньше, или очередь каким-то образом прерывает какую-то логику?