Перемещение действия Mailer в очередь Resque - PullRequest
0 голосов
/ 06 сентября 2018

Действие контроллера вызывает 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 без дальнейших изменений, как это было раньше, или очередь каким-то образом прерывает какую-то логику?

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете настроить resque для работы с ActionMailer.

  1. Добавьте gem 'resque' в свой гемфайл.
  2. Внести изменения в адаптер в application.rb - config.active_job.queue_adapter = :resque
  3. Используйте следующее для создания задания - rails g job SendEmail

class SendEmail< ActiveJob::Base
  queue_as :default

  def perform(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
end

В вашем контроллере вы можете сделать

SendEmail.set(wait: 10.seconds).perform_later(@fg.id, @mailing.id)
...