2011-04-14 62 views
0

如何从rake文件创建延迟作业。我应该如何将它移入控制器并创建一个每15分钟运行一次任务的delayed_job。Rails帮助从rake文件创建delayed_job

下面是一个例子,如何我耙文件:

namespace :reklamer do 

    task :runall => [:iqmedier, :euroads, :mikkelsen] do 
     # This will run after all those tasks have run 
    end 

     task :iqmedier => :environment do 
       require 'Mechanize' 
       agent = WWW::Mechanize.new 
       agent.get("http://www.iqmedier.dk") 
     end 
     task :euroads => :environment do 
      require 'Mechanize' 
      require 'pp' 
      agent = Mechanize.new { |agent| 
     end 

     task :mikkelsen => :environment do 
      require 'Mechanize' 
      agent = Mechanize.new 
      agent.get("http://affilate.mikkelsenmedia.dk/partnersystem/mylogins.php") 
     end 
    end 

我应该怎么改是一个延迟的工作(https://github.com/collectiveidea/delayed_job)?

+0

我的问题清楚了吗? – 2011-04-14 11:56:31

+0

“延迟工作”是什么意思?图书馆(https://github.com/tobi/delayed_job)或只是在后台运行的东西? – Wukerplank 2011-04-14 13:40:50

+0

我的意思是https://github.com/collectiveidea/delayed_job而不是cron作业,因为heroku每隔1小时只能运行cron作业 – 2011-04-14 13:48:51

回答

0

建议您查看SimpleWorker,这是一款适用于Ruby应用程序的基于云的后台处理/工作队列。它专为卸载任务,运行预定作业以及扩展以同时处理许多并行作业而设计。它很简单,价格合理,可扩展。

(披露,我为公司工作。)

你创建你的员工(在app /工人),然后在你的控制器和其他地方排队起来马上运行或调度以便日后或在只需几行代码即可重复使用。这是一个基本的例子。

 
    worker = ReportWorker.new 
    worker.user_id = @current_user.id 
    worker.schedule(:start_at => 1.hours.since, :run_every => 900) 

    #Or to run once right away 
    #worker.queue 

ReportWorker类将包含为当前用户创建报告并发送或发布它所需的逻辑。

+0

适当的一个大型网站的一个很好的解决方案。但我只需要每15分钟运行一个后台任务 – 2011-04-22 19:07:03

0

DelayedJob本身并不会帮助你,因为它基于一次性工作。你仍然需要定期运行的东西来创造这些工作。

假设:

  1. 你在Heroku上,只能获得1小时的cron
  2. 你需要运行一个任务,每15分钟

你可以做这样的事情...

做一个类作业:

class MechanizeJob < Struct.new(:url) 
    def perform 
    agent = Mechanize.new 
    agent.get(url) 
    end 
end 

计划从您的Rakefile的工作:

task :schedulejobs => :environment do 
    urls = ["http://...", "http://...", "http://..."] 
    urls.each do |url| 
    # 1 is the job priority 
    Delayed::Job.enqueue MechanizeJob.new(url), 1, Time.now 
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 15.minutes.from_now 
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 30.minutes.from_now 
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 45.minutes.from_now 
    end 
end 

这将运行每个URL工作每隔15分钟。

+0

班级进入哪个文件夹?你可以用这个代码的例子http://stackoverflow.com/questions/5674880/rails-delayed-job-not-working – 2011-04-15 10:26:48