2011-04-19 140 views
2

可能重复:
Rails delayed job not workingRails如何为heroku上的rake任务创建后台任务?

如何创建应该运行在Heroku上每15分钟一个后台任务?

如何使用clockwork和delayed_job进行周期性刮擦是其他plugsins/gems?

我耙文件:

desc "Importer statistikker" 
namespace :reklamer do 
task :runall => [:iqmedier, :euroads, :mikkelsen, :orville ] 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") 
       agent.page.link_with(:href => "/Publisher/Stats").click 
       form = agent.page.forms.first 
       form.submit 

       @stats = agent.page.search('//tr')[-2] 

       @existing = Reklamer.find(:first, :conditions => {:dato => @stats[0]}) 
       if @existing.nil? 
        Reklamer.create!(:virksomhed => 'Iqmedier', :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) 
       elsif @existing.dato != Date.today 
       Reklamer.create!(:virksomhed => 'Iqmedier', :dato => Date.today, :unik_klik => 0, :klik => 0, :unik_vis => 0, :vis => 0, :leads => 0, :ordre => 0, :cpc => 0, :earn => 0) 
       else 
       @existing.update_attributes!(:leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) 
       end 
     end 
     task :euroads => :environment do 
      require 'Mechanize' 
      require 'pp' 
      agent = Mechanize.new { |agent| 
      agent.user_agent_alias = 'Mac Safari'} 
      agent.get("http://www.euroads.dk") 
      @stats = agent.page.search('table.ea') 

      @existing = Reklamer.find(:first) 
      if @existing.nil? 
       Reklamer.create!(:klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) 
      elsif @existing.dato != Date.today 
       Reklamer.create!(:virksomhed => 'Euroads', :dato => Date.today, :unik_klik => 0, :klik => 0, :unik_vis => 0, :vis => 0, :leads => 0, :ordre => 0, :cpc => 0, :earn => 0) 
      else 
       @existing.update_attributes(:unik_klik => :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8]) 
      end 
     end 

     task :mikkelsen => :environment do 
      require 'Mechanize' 
      agent = Mechanize.new 
      agent.get("http://affilate.mikkelsenmedia.dk") 
      @stats = agent.page.search('//tr')[-5].search('td').map{ |n| n.text } 

      @existing = Reklamer.find(:first, :conditions => {:dato => @stats[0] }) 
      if @existing.nil? 
       Reklamer.create!(:virksomhed => 'Mikkelsen', :dato => @stats[0], :unik_klik => @stats[3], :klik => @stats[3].to_i, :unik_vis => @stats[1], :vis => @stats[1], :leads => @stats[4], :ordre => @stats[9], :cpc => @stats[3], :earn => @stats[5]) 
      else 
       @existing.update_attributes(:virksomhed => 'Mikkelsen', :dato => @stats[0], :unik_klik => @stats[3], :klik => @stats[3].to_i, :unik_vis => @stats[1], :vis => @stats[1], :leads => @stats[4], :ordre => @stats[9], :cpc => @stats[3], :earn => @stats[5]) 
      end 
     end 
     task :orville => :environment do 
      require 'Mechanize' 
      agent = WWW::Mechanize.new 
      agent.get("https://dk.orvillemedia.com") 
      @dato = Date.today.strftime("%Y-%m-%d").to_s 
      @month = Date.today.strftime("%m").to_s 
      @day = Date.today.strftime("%d").to_s 
      agent.get("https://dk.orvillemedia.com/publisher/stats.php?sd=#{@day}&sm=#{@month}") 
      @stats = agent.page.search('td') 

      @existing = Reklamer.find(:first, :conditions => {:dato => @dato}) 
      if @existing.nil? 
       Reklamer.create!(:vis => @stats[1], :leads => @stats[3], :ordre => '0') 
      else 
       @existing.update_attributes(:ordre => '0', :cpc => (@stats[5] == '-' ? 0 : @stats[3]), :earn => @stats[6]) 
      end 
     end 
     end 
+0

你可以在这里找到答案[http://stackoverflow.com/questions/5643192/heroku-cron-job-help](http://stackoverflow.com/questions/5643192/heroku-cron-job-help ) – 2011-04-19 08:11:15

+0

如何为我的rake任务制作delayed_job? – 2011-04-19 08:12:09

+0

请任何人都可以帮我我一直坚持这个为期2.5周,而我还没有找到任何解决方案 – 2011-04-21 21:05:41

回答

4

在你的Gemfile:

gem 'delayed_job' 

在LIB/scraper.rb:

class Scraper 
    def perform 
    # All the scraping code you need to run goes here. 
    end 

    def error(job, exception) 
    # Send a warning email to yourself, or whatever. 
    # The scraping will automatically be retried. 
    end 

    def success(job) 
    # Schedule the next scraping. 
    Delayed::Job.enqueue(Scraper.new, :run_at => 15.minutes.from_now) 
    end 
end 

然后启动最初的Scraper,它会从那里处理事情。在heroku控制台中,运行:

Scraper.new.perform 

您需要让工作人员始终运行才能运行报废。

+0

我不能使用聘用和防火来最大限度地降低成本吗? – 2011-04-27 23:01:24

+1

根据hirefire的github自述,它与run_at不兼容,所以没有。 – PreciousBodilyFluids 2011-04-27 23:25:15

+0

我认为它可能与hirefire兼容,但是您必须将min worker设置为1.我错了吗? – 2012-03-10 22:44:13

1

这让你每小时任务: http://addons.heroku.com/cron

+0

是的每小时我需要每15分钟 – 2011-04-22 13:41:23

+0

Heroku上的Cron插件已弃用。而不是Cron附加组件,您现在应该使用计划程序附加组件:https://devcenter.heroku.com/articles/scheduler – 2012-06-14 09:27:49