加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 4:如何在单独的线程中发送邮件?

发布时间:2020-12-17 02:55:15 所属栏目:百科 来源:网络整理
导读:我有一个应用程序,当管理员做某事时,需要偶尔向整个用户群发送电子邮件.这工作正常,但是当有很多用户时,管理员的页面将等到所有邮件都被发送,这是不可取的. 为了缓解这种情况,我尝试在新线程中发送电子邮件: t = Thread.new do User.all.each do |user| Mai
我有一个应用程序,当管理员做某事时,需要偶尔向整个用户群发送电子邮件.这工作正常,但是当有很多用户时,管理员的页面将等到所有邮件都被发送,这是不可取的.

为了缓解这种情况,我尝试在新线程中发送电子邮件:

t = Thread.new do
  User.all.each do |user|
    Mailer.email(user).deliver
  end
end
at_exit{ t.join }

这工作正常,但在我的测试套件中,我无法测试以确保电子邮件发送工作:

# This test now fails with the new Thread above
test "admin action should send email blast" do
  assert_difference("ActionMailer::Base.deliveries.count",User.count) do
    post :action
  end
end

所以我的问题是:

>这种方法是在新线程中发送电子邮件的最佳方式吗?或者是否有可用于处理此类交互的宝石?
>如果在新线程中完成发送,如何测试我的测试套件中是否发送了电子邮件?有没有办法检查等待所有线程完成?

解决方法

在rails 4.2中有一个特殊的类来处理名为 ActiveJob的作业,活动作业允许您为另一个进程排队长任务以在后台处理它们,也可以将任务排队一段时间,例如“明天发送此电子邮件”早上8点“.

要处理这些队列,您需要选择后端来处理它们,这里是list of backends that support ActiveJob

每个都有它的优点和缺点,sidekiq例如是一个多线程处理程序,所以它使用较低的内存,而例如sucker punch使用与主服务器相同的线程,因此它使用更少的内存,适合如果你有一个低内存无法处理第二个ruby线程的服务器.

至于测试部分,rails guide已经解释了如何测试你的电子邮件和测试电子邮件是否排队等测试,并测试是否呈现了正确的模板,以及它是否包含正确的文本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读