2

在我的Product#create方法中,我有类似的东西

ProductNotificationMailer.notify_product(n.email).deliver

如果产品被保存,则会触发。现在事情是在上述被触发之前,有一堆逻辑和计算发生,这会延迟确认页面的加载时间。有没有办法确保下一页首先加载并且邮件传递可以稍后或在后台进行?

谢谢

4

2 回答 2

2

是的,您需要调查后台工作人员。SidekiqDelayedJobResque是一些流行的。

这是一个很棒的RailsCast 演示 Sidekiq

class NotificationWorker
  include Sidekiq::Worker

  def perform(n_id)
    n = N.find(n_id)
    ProductNotificationMailer.notify_product(n.email).deliver 
  end
end

我不确定n你的例子是什么,所以我就照做了。现在,您在哪里工作,您可以将其替换为:

NotificationWorker.perform_async(n.id)

您不将完整对象n作为参数传递的原因是因为参数将被序列化,并且仅序列化整数 id 更容易/更快。

存储作业后,您将在后台运行第二个进程来完成工作,从而释放您的 Web 进程以立即返回呈现响应。

于 2013-05-20T17:12:23.957 回答
1

延迟的作业会这样做:

这是github页面。

这是关于设置它的railscast。

于 2013-05-20T17:14:52.127 回答