将Mailer操作移至Resque队列

时间:2018-09-05 21:19:45

标签: ruby-on-rails resque-scheduler

控制器动作调用TextMailer.contact(fg, mailing).deliver_now,但是需要在确定的时间使用resque-scheduler gem将其移入后台作业。

因此,控制器动作现在将调用:

 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)perform方法是否需要调用时间值(在使用enqueue_at显式地给出时间键的情况下调用Resque似乎是违反直觉的,不需要隐式地重复)?

2)是否可以像以前一样运行ActionMailer方法而无需进一步更改即可调用它,或者队列是否以某种方式中断了某些逻辑?

1 个答案:

答案 0 :(得分:1)

您可以配置resque以与ActionMailer一起使用。

  1. gem 'resque'添加到您的gemfile。
  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)