2014-02-21 159 views
0

我是Rails开发新手,我有一个问题。有以下代码:在另一个线程执行任务

def create 
    @order = current_user.orders.create!(order_params) 
    OrderMailer.send_order_info(@order).deliver 
end 

此代码创建一个新订单,呈现json结果并发送有关它的电子邮件。邮件发送需要一些时间,我想我应该在另一个线程或类似的东西上做。请给我建议,我该如何做到这一点。谢谢!

+1

Yo你可以使用[sidekiq](https://github.com/mperham/sidekiq),[delayed_job](https://github.com/collectiveidea/delayed_job),[resque](https://github.com/resque/resque)或类似的东西。 –

回答

0

您应该使用延迟电子邮件发送。你可以用Sidekiq,Delayed Job或Resque来做。

您还可以使用这些宝石推迟任何其他工作。

你应该看看文档,看看哪一个最适合你的使用。

我个人使用Sidekiq,但如果您只想将它​​用于邮件程序,最容易安装Delayed Job

+0

I.e. JSON响应将立即呈现,电子邮件任务稍后? – malcoauri

+0

是的,邮件将从另一个线程发送,并且不会冻结您的应用程序。所有邮件将在延迟队列中排队,并从延迟作业线程发送出去。 –

+0

哪个宝石可以作为最简单的宝石建议? – malcoauri

0

我们用菌种此:它更名为 “Spawnling” 现在

https://github.com/tra/spawnling

非常容易使用:(控制器)

@user = User.create(params[:user]) 
spawn do 
    @user.do_some_slow_background_stuff 
end 

,或者,如果你想监视后台进程是否已完成(@spawn_id是pid)

@user = User.create(params[:user]) 
spawner = spawn do 
    @user.do_some_slow_background_stuff 
end 
@spawn_id = spawner.handle 
相关问题