2013-05-20 46 views
2

Product#create我的方法我有类似延迟发送邮件,以提高网页加载时间

ProductNotificationMailer.notify_product(n.email).deliver 

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

谢谢

回答

2

是的,你会想看看背景的工作人员。 Sidekiq,DelayedJobResque是一些流行的。

这是一个伟大的RailsCast demonstrating 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。

一旦作业存储,你必须在做这项工作,释放你的网页的过程立刻回去呈现响应后台运行的第二处理。

+0

甜蜜。我会试试看。谢谢 – psharma

+0

你知道是否有办法在轨道内做?我相信我无法在生产服务器上安装redis,也不能同时运行两个实例(rails和redis)。 – psharma

+0

@psharma,DelayedJob不需要额外的redis服务器,但你仍然需要一个独立的进程来让后台工作人员处理Rails应用程序正常请求/响应循环之外的工作。 –