结合活动作业和行动邮件的最佳方法?

时间:2018-09-27 12:16:50

标签: ruby-on-rails actionmailer rails-activejob

使用Rails Action Mailer时,您可以选择使用deliver_now立即发送电子邮件,或者使用deliver_later使用Active Job异步发送。如果未为Active Job指定适配器,它将使用进程内线程池,如果服务器要停止,则该线程池将不会持久。另外,我可以创建一个Job来管理我的电子邮件,然后可以用perform_nowperform_later来调用,据我了解,它们与deliver_now大致相同和deliver_later

我的问题是,如果我指定一个适配器,比如说Sidekiq,然后有一个数据库来存储我的作业,为什么我要创建一个作业来处理我的电子邮件?还有其他好处,还是不必要的步骤?略有不同的是,如果我确实想为该流程创建工作,我的电子邮件方法是否需要deliver_now或根本不需要任何内容​​?我假设电子邮件是说deliver_later,是否会将电子邮件打回队列的末尾并迫使其再次等待直到发送出去?


为了说明这一点,如果我没有为处理电子邮件而设置的工作,我可以简单地进行以下操作:

class UserMailer < ActionMailer::Base
  def send_email(user)
    mail(to: user.email, subject: "My Subject")
  end
end

要致电,我将使用: UserMailer.send_email(my_user).deliver_later

但是,如果我想添加工作,并且两个选项都用UserJob.perform_later(user)调用,我的设置将是:

class UserJob < ActiveJob::Base
  def perform(user)
    UserMailer.send_email(user).deliver_now
  end
end

def perform(user)
  UserMailer.send_email(user)
end

最后,我认为这没有道理,但是如果我使用

会发生什么:

def perform(user)
  UserMailer.send_email(user).deliver_later
end

0 个答案:

没有答案