添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

#171 Delayed Job

Jul 20, 2009 | 10 minutes | Plugins , Background Jobs
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