【发布时间】:2015-07-06 17:51:57
【问题描述】:
我有一个应用程序,当管理员做某事时,它需要偶尔向整个用户群发送电子邮件。这工作正常,但是当有很多用户时,管理员页面将等到所有邮件都发送完毕,这是不可取的。
为了缓解这种情况,我尝试在新线程中发送电子邮件:
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
所以我的问题是:
- 这种方法是在新线程中发送电子邮件的最佳方式吗?或者是否有可用的 gem 来处理这种交互?
- 如果发送是在新线程中完成的,我如何测试电子邮件是否在我的测试套件中发送?有没有办法检查等待所有线程完成?
【问题讨论】:
-
1. 我只是将发送电子邮件逻辑提取到一个单独的方法中,然后对其进行测试。 2. 有一种方法可以通过调用
Thread.join方法或在您的情况下为t.join进行检查之前等待所有线程完成
标签: ruby-on-rails multithreading email ruby-on-rails-4