使用Rails Action Mailer时,您可以选择使用deliver_now
立即发送电子邮件,或者使用deliver_later
使用Active Job异步发送。如果未为Active Job指定适配器,它将使用进程内线程池,如果服务器要停止,则该线程池将不会持久。另外,我可以创建一个Job来管理我的电子邮件,然后可以用perform_now
或perform_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