Rails 4 - Mailer deliver_later没有按照我的预期进行操作,阻止了UI

时间:2015-02-28 08:42:16

标签: ruby-on-rails ruby ruby-on-rails-4 actionmailer

我有一个rails应用程序,其中我有一个发送了不少电子邮件的功能。我想这样做asynchronously,我认为方法deliver_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_later,或者方法没有按照我的预期行事。在那种情况下,我可以使用另一种方法来提高我的表现吗?

1 个答案:

答案 0 :(得分:14)

deliver_later使用ActiveJob来提供异步执行。

然而,ActiveJob本身并不提供异步性 - 它是一个统一的api层,可以被许多后端实现。默认的只运行内联它不是异步。

要获得异步使用,您需要选择异步后端。您可以在应用程序的配置

中配置后端
 config.active_job.queue_adapter = ...

通常,大多数适配器都需要相应的gem(例如delayed_job,sidekiq,sucker_punch),它们也可能有自己的依赖关系(例如sidekiq要求你使用redis。