Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails4-MailerDeliver\u未按我的预期执行,会阻塞UI_Ruby On Rails_Ruby_Ruby On Rails 4_Actionmailer - Fatal编程技术网

Ruby on rails Rails4-MailerDeliver\u未按我的预期执行,会阻塞UI

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

我有一个rails应用程序,其中我有一个发送很多电子邮件的功能。我想异步地做
,我认为方法
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的线程安全性。