控制器动作调用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方法而无需进一步更改即可调用它,或者队列是否以某种方式中断了某些逻辑?
答案 0 :(得分:1)
您可以配置resque以与ActionMailer一起使用。
gem 'resque'
添加到您的gemfile。application.rb
-config.active_job.queue_adapter = :resque
中的适配器进行更改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)