【问题标题】:Rails delayed job not workingRails 延迟工作不工作
【发布时间】:2011-08-06 04:51:36
【问题描述】:

我延迟的工作没有工作。我正在尝试使用应每 15 分钟运行一次的延迟作业为 rake 文件创建后台任务。我已经在我的 rake 文件中复制了我的 rake 任务,并将它们作为方法设置在我的控制器中。我需要一份延迟的工作,因为 heroku 每 1 小时只做一个 cron。

这是我的应用程序控制器:

class ApplicationController < ActionController::Base

require 'delayed_job'
require 'Mechanize'
require 'pp'


protect_from_forgery

def iqmedier
          agent = WWW::Mechanize.new
          agent.get("http://www.iqmedier.dk")
          form = agent.page.forms.first
          form.submit

          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', :dato => @stats[0], :unik_klik => @stats[1], :klik => @stats[2], :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 => '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!(:unik_klik => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
          end
  end
 def euroads
        agent = Mechanize.new { |agent|
        agent.user_agent_alias = 'Mac Safari'}
        agent.get("http://www.euroads.dk")
        form = agent.page.forms.first
        form.submit
        @month = Date.today.strftime("%m").to_s
        agent.get("http://www.euroads.dk/system/index.php?showpage=showstat&show=overview&month=#{@month}&year0=2011&day=1&month=#{@month}&year=2011&day1=31&month1=#{@month}&year1=2011&fk_campaign=&fk_survey=&fk_track=&fk_pool=&columns1=1&columns2=2&columns4=4&columns14=14&columns5=5&columns6=6&columns7=7&columns8=8&columns9=9")

        @stats =  agent.page.search('table.ea').search('tr')

        @existing = Reklamer.find(:first, :conditions => {:dato => @stats[0]})
        if @existing.nil?
            Reklamer.create!(:virksomhed => 'Euroads', :dato => @stats[0], :unik_klik => @stats[1], :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 => @stats[1], :klik => @stats[2].to_i, :unik_vis => @stats[3], :vis => @stats[4], :leads => @stats[5], :ordre => @stats[6], :cpc => @stats[7], :earn => @stats[8])
        end
  end

def mikkelsen
        agent = Mechanize.new
        agent.get("http://affilate.mikkelsenmedia.dk/partnersystem/mylogins.php")

        form = agent.page.forms.first
        @stats = agent.page.search('//tr')

        @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
def orville
        agent = WWW::Mechanize.new
        agent.get("https://dk.orvillemedia.com")

        form = agent.page.forms.first
        form.submit
        @dato = Date.today.strftime("%Y-%m-%d").to_s
        @month = Date.today.strftime("%m").to_s
        @day = Date.today.strftime("%d").to_s
        @stats = agent.page.search('//tr')

        @existing = Reklamer.find(:first, :conditions => {:dato => @dato})
        if @existing.nil?
            Reklamer.create!(:virksomhed => 'Orville', :dato => @dato, :unik_klik => @stats[2], :klik => @stats[2].to_i, :unik_vis => @stats[1], :vis => @stats[1], :leads => @stats[3], :ordre => '0', :cpc => (@stats[5] == '-' ? 0 : @stats[3]), :earn => @stats[6])
        else
          @existing.update_attributes(:virksomhed => 'Orville', :dato => Date.today, :unik_klik => @stats[2], :klik => @stats[2].to_i, :unik_vis => @stats[1], :vis => @stats[1], :leads => @stats[3], :ordre => '0', :cpc => (@stats[5] == '-' ? 0 : @stats[3]), :earn => @stats[6])
        end
   end

def runall
  [:iqmedier, :euroads, :mikkelsen, :orville].each{|a| send(a)}    
end
handle_asynchronously :runall, :run_at => Proc.new { 5.minutes.from_now }

当我运行 rake jobs:work 时,它会启动,但无法运行的 runall 作业

【问题讨论】:

  • 我在任何地方都没有看到延迟呼叫@_@
  • 延迟调用应该去哪里?
  • GET 是什么意思。屏幕抓取是 POST。 run all 应该是所有方法,iqmedier、euroads、orville 和 mikkelsen
  • 延迟是将工作添加到您的工作数据库的延迟
  • 我的控制器应该延迟到哪里?

标签: ruby delayed-job


【解决方案1】:

如果我正确理解您要执行的操作,那么您应该具备以下条件:

scraper.rb


require 'mechanize'

class Scraper
  def perform
    [:iqmedier, :euroads, :mikkelsen, :orville].each{|a| send(a)}
  end

  def iqmedier
    # some code
  end

  def mikkelsen
    # some code
  end

  def orville
    # some code
  end

end

在您的控制器中:


require 'delayed_job'
class MyController < ApplicationController
  def runall
    Delayed::Job.enqueue(Scraper.new, :run_at => 5.minutes.from_now)
  end
end

对于从 Rails 外部添加作业,您可以编写类似的内容,然后使用 rails runner 运行它:


require 'scraper'
Delayed::Job.enqueue Scraper.new
Delayed::Job.enqueue Scraper.new, :run_at => 15.minutes.from_now
Delayed::Job.enqueue Scraper.new, :run_at => 30.minutes.from_now
Delayed::Job.enqueue Scraper.new, :run_at => 45.minutes.from_now

【讨论】:

  • 我已将 runall 放入我的应用程序控制器和 scraper.rb myapproot/lib/jobs。当我运行 rake jobs:work 时,一个工人开始工作,但似乎什么也没发生。它只是卡在启动工人中
  • 您是否使用浏览器浏览到应该将作业排入队列的 URL,例如。东西/运行?
  • 当我浏览操作 runall 时,我得到一个 nameerror: uninitialized constant ApplicationController::Scraper
  • 你需要'scraper'。
  • 现在说模板丢失?为什么需要视图?
【解决方案2】:

如果您只想每 X 分钟/小时运行一次代码,那么您就不需要 delay_job 了。那将是一种矫枉过正和过度设计。只需在此处使用此代码:

    until 2 < 1 do 
        if Time.now.min % 15 == 0

            puts "Execute your code here!"

            if Time.now.min % 15 == 0
                sleep(60)
            end
        end
    end

将代码放入 Rakefile,从中创建一个任务并将其部署在 heroku worker dyno 上。那可行。这是一个完整的教程:http://robert-reiz.com/2012/06/12/cron-jobs-on-heroku/。

对于该解决方案,您甚至不需要 Herokus Cron 或 Scheduler Add-On。而且您不需要任何额外的 GEM,例如延迟作业。务实的解决方案。保持苗条;-)

【讨论】:

  • 如果您需要更复杂的 cron 任务调度程序,请查看 Rufus 和发条。我想这比 delay_job 更适合您的用例。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多