我有一个非常基本的邮件发送设置,如下所示,用于发送交易邮件:
class PayoutMailer < ApplicationMailer
default from: 'hello@groundworkai.com'
def payout_success_email(email, payment_size, user_name)
@payment_size = payment_size
@user_name = user_name
subject = 'Your Rewards Have Been Sent!'
mail(to: email, from: 'hello@myservice.com', subject: subject)
end
end
“我正在测试这行代码:”
PayoutMailer.payout_success_email('test@example.com',
200000,
'test name').deliver_later
我的问题是,当我使用 .deliver 或 .deliver_now 时,邮件可以发送,但是当我异步委派它使用 deliver_later 时,它被排队了但从未发送。输出如下:
I, [2018-01-20T15:27:44.140104 #4] INFO -- : [ActiveJob] Enqueued ActionMailer::DeliveryJob (Job ID: 265cb31a-dec4-4adb-866d-06e44645c53a) to Async(mailers) with arguments: "PayoutMailer", "payout_success_email", "deliver_now", "test@example.com", 200000, "test name"
根据文档,当使用deliver_later时,ActionJob会处理它:
Active Job的默认行为是通过: async适配器执行作业。因此,您现在可以使用deliver_later异步发送电子邮件。Active Job的默认适配器使用进程内线程池运行作业。它非常适合开发/测试环境,因为它不需要任何外部基础结构,但是对于生产环境来说不太合适,因为它会在重新启动时删除挂起的作业。如果您需要一个持久性后端,则需要使用具有持久性后端的Active Job适配器(Sidekiq、Resque等)。
目前,我不需要一个持久性后端,并且使用进程内线程池也没有问题。是否有办法在不引入Sidekiq + Redis的外部基础设施的情况下使用deliver_later?