Rails 5:ActionMailer的“deliver_later”从未投入生产

时间:2018-01-21 05:44:47

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

我有一个非常基本的邮件程序设置如下,以发送交易邮件:

$id = 122;

// count using filter
$count = collect($myArrayOfObjects)->filter(function ($object) use ($id) { return $object->id === $id; })->count();

// count using where
$count = collect($myArrayOfObjects)->where('id', $id)->count();

// to get the summation of total
$sum = collect($myArrayOfObjects)->where('id', $id)->sum('total');

我正在测试这条线:

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

我的问题是,当我使用.deliver或.deliver_now时,邮件会发送,但是当我使用deliver_later异步委托它时,它会排队但从不发送。输出是:

PayoutMailer.payout_success_email('test@example.com',
                                          200000,
                                          'test name').deliver_later

根据docs,我知道ActionJob在使用deliver_later时正在处理它:

  

Active Job的默认行为是通过:async执行作业   适配器。因此,您现在可以使用deliver_later发送电子邮件   异步。 Active Job的默认适配器运行带有的作业   进程内线程池。它非常适合开发/测试   环境,因为它不需要任何外部基础设施,   但它不适合生产,因为它会减少待完成的工作   重新开始。如果您需要持久的后端,则需要使用   具有持久后端的活动作业适配器(Sidekiq,Resque,   等)。

此时,我不需要持久的后端,并且可以使用进程内线程池。有没有办法让我在没有引入Sidekiq + Redis的外部基础设施的情况下使用deliver_later?

1 个答案:

答案 0 :(得分:4)

异步适配器无法通过rake任务工作。

尝试内联,或使用deliver_now

http://edgeguides.rubyonrails.org/active_job_basics.html#job-execution

  

使用Rake任务中的异步队列(例如,使用.deliver_later发送电子邮件)通常不起作用,因为Rake可能会结束,导致进程内线程池被删除,在任何/所有之前.deliver_later电子邮件已处理完毕。要避免此问题,请使用.deliver_now或在开发中运行持久队列。