#171
Delayed Job
Is there a long running task which should be handled in the background? One of the best ways is using the delayed_job plugin like I show in this episode.
Download:
source code
Project Files in Zip (113 KB)
mp4
Full Size H.264 Video (16.4 MB)
m4v
Smaller H.264 Video (11.3 MB)
webm
Full Size VP8 Video (31.3 MB)
ogv
Full Size Theora Video (23.5 MB)
官方发布的Delayed_job可以在这里找到
tobi’s Github pages
,这上面有许多的分支,最好选择由
collectiveidea
提供的分支,这个分支功能更新也更完善,并且提供了一个生成脚本,用于创建Delayed_job需要的表。
使用下面的命令安装Delayed_job
terminal
script/plugin install git://github.com/collectiveidea/delayed_job.git
mailing =
Mailing
.find(params[
:id
])
mailing.deliver
flash[
:notice
] =
"
Mailing delivered
"
redirect_to mailings_url
mailing =
Mailing
.find(params[
:id
])
mailing.send_later(
:deliver
)
flash[
:notice
] =
"
Mailing is being delivered.
"
redirect_to mailings_url
class MailingJob < Struct.new(:mailing_id)
def perform
mailing = Mailing.find(mailing_id)
mailing.deliver
这个类中必须要有一个无参的perform
方法,这使得需要一个以mailing_id
作为参数的初始化方法来传递需要被发送的邮件的mailing_id
。
习惯上在用delayed_job的时候会让类继承struct,这样可以自由定义我们想要类拥有的属性。现在,初始化MailingJob
的时候mailing_id
会作为第一个参数,这恰好提供了mailing_id
,而不需要创建实例变量或是初始化方法。
现在,MailingController是这个样子的
/app/controllers/mailings_controller.rb
def deliver
Delayed::Job.enqueue(MailingJob.new(params[:id]))
flash[:notice] = "Mailing is being delivered."
redirect_to mailings_url
delayed_job最后一个值得提及的特性就是自动重试功能。如果一个方法抛出了异常,这个异常会被捕获,之后这个方法将会重新运行。这个过程最多重复25次,次数越多重试的时间间隔就越长。需要特别注意的是,在这个邮件发送程序中,如果邮件发送中途出错,应该确认是从发送失败的那封邮件开始重试而不是整个邮件列表重新发送。
这些就是delayed_job的简单介绍。正如我们看到的,这已经是一个功能相当完整的插件,最好的创建后台执行任务的应用之一
q