Rails帮助从rake文件创建delayed_job

时间:2011-04-14 10:41:42

标签: ruby ruby-on-rails-3 heroku rake delayed-job

如何从rake文件创建延迟作业。我应该如何将其移动到控制器中并创建一个每15分钟运行一次任务的delayed_job。

以下是我的rake文件的示例:

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)?

2 个答案:

答案 0 :(得分:0)

单凭DelayedJob对你来说无济于事,因为它基于一次性工作。你仍然需要定期运行的东西来创造这些工作。

假设:

  1. 你在Heroku上只能获得1小时的cron
  2. 你需要每15分钟就有一份工作
  3. 你可以这样做......

    为你的工作上课:

    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
    

    这将每15分钟按网址运行一次。

答案 1 :(得分:0)

建议您查看SimpleWorker,它是Ruby应用程序的基于云的后台处理/工作队列。它专为卸载任务,运行预定作业和扩展以同时处理多个并行作业而设计。它简单,经济实惠且可扩展。

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

您创建您的工作人员(在app / worker中),然后在您的控制器和其他地方排队等待他们立即运行或安排他们以后或只需几行代码重复。这是一个基本的例子。

  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类将包含为当前用户创建报告并将其发送或发布所需的逻辑。