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已经解释了如何测试你的电子邮件和测试电子邮件是否排队等测试,并测试是否呈现了正确的模板,以及它是否包含正确的文本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |