gpt4 book ai didi

ruby-on-rails - rails 4 : How to send mail in a separate thread?

转载 作者:行者123 更新时间:2023-12-04 06:34:45 26 4
gpt4 key购买 nike

我有一个应用程序,当管理员执行某些操作时,它需要偶尔向整个用户群发送电子邮件。这工作正常,但是当有很多用户时,管理员页面会等到所有邮件发送完毕,这是不可取的。

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

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 来处理这种交互?
  • 如果发送是在新线程中完成的,我如何测试电子邮件是否在我的测试套件中发送?有没有办法检查以等待所有线程完成?
  • 最佳答案

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

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

    每个都有它的优点和缺点,例如 sidekiq 是一个多线程处理程序,所以它使用较低的内存,而例如吸盘冲床使用与主服务器相同的线程,因此它使用的内存要少得多,适合内存不足的情况无法处理第二个 ruby​​ 线程的服务器。

    测试部分,rails guide已经解释了如何测试您的电子邮件并测试诸如电子邮件是否已排队等内容,并测试是否呈现了正确的模板,以及它是否包含正确的文本。

    关于ruby-on-rails - rails 4 : How to send mail in a separate thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909943/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com