Ruby on rails Rails4-MailerDeliver\u未按我的预期执行,会阻塞UI
我有一个rails应用程序,其中我有一个发送很多电子邮件的功能。我想异步地做Ruby on rails Rails4-MailerDeliver\u未按我的预期执行,会阻塞UI,ruby-on-rails,ruby,ruby-on-rails-4,actionmailer,Ruby On Rails,Ruby,Ruby On Rails 4,Actionmailer,我有一个rails应用程序,其中我有一个发送很多电子邮件的功能。我想异步地做,,我认为方法deliver\u later可以做到这一点。目前,我有一些延迟,从用户单击submit到表单提交,这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示: def create respond_to do |format| if @competition.save [...] send_notification_to_team_members en
,
,我认为方法deliver\u later
可以做到这一点。目前,我有一些延迟,从用户单击submit
到表单提交,这会导致糟糕的用户体验(这是一个非常简单的表单)。我的实现如下所示:
def create
respond_to do |format|
if @competition.save
[...]
send_notification_to_team_members
end
end
def send_notification_to_team_members
@team.members.each do |member|
unless member.user.eql?(current_user)
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later
end
end
end
目前,完成操作需要约4秒钟。我也尝试过:
Mailer.deliver_new_competition_notification(member.user, @competition).deliver_later(wait: 1.minute)
然后需要更长的时间-我估计大约需要1分钟
那么,我是否错误地使用了
deliver\u later
,或者该方法没有达到我预期的效果。在这种情况下,有没有其他方法可以提高我的绩效 deliver\u later
用于提供异步执行
然而,ActiveJob本身并不提供异步性——它是一个统一的api层,可以由许多后端实现。默认的只是运行所有内联的,而不是异步的
要获得异步使用,您需要选择一个异步后端。您可以在应用程序的配置中配置后端
config.active_job.queue_adapter = ...
一般来说,大多数适配器都需要相应的gem(例如延迟的job、sidekiq、sucker\u punch),它们也可能有自己的依赖项(例如,sidekiq要求您使用redis。您使用的是什么activejob后端?您应该异步发送电子邮件。如果您使用的是4.2,您可以使用activejob,如果不是,您应该使用诸如sidekiq或Rescue之类的解决方案。仅供参考:这是一篇关于使用activejob发送电子邮件的好文章。@FrederickCheung I use
class Mailer
,如果这是你的意思的话?@maxd谢谢,我会看一看。谢谢!我决定安装delayed\u job
,带有:gem'delayed\u job\u active\u record'
,我在这里遵循了安装过程:application.rb
中添加了:config.active\u job.queue\u adapter=:delayed\u job
这样使用:Mailer.deliver\u new\u competition\u通知(member.user,@competition).deliver_稍后!
。我没有收到任何错误,但是电子邮件没有在localhost:3000
上发送。我错过了什么吗?谢谢,我决定改为使用sidekiq
。虽然它看起来更容易安装。但我遇到了一些其他问题,在这里问了一个新问题:比延迟工作更容易?值得一提的是eqik要求您的代码(和依赖项)是线程安全的。作为一种令人高兴的媒介,我建议使用resque,因为它比延迟的任务快得多,但不需要sideqik的线程安全性。