2

我想抓取一些网站,我希望这应该由单独的工作进程完成。我开始了解延迟工作以在后台完成工作。我在我的 rails 应用程序中使用了collectiveidea/delayed_job。我遵循了rails 3.0 和活动记录的安装步骤。

之后,我在 lib 文件中创建了一个 dj.rb 并编写了如下代码。

require 'nokogiri'
require 'open-uri'
class Dj_testing
  def perform
    #code for scraping the site
    #code to add entry into database 
  end
end

现在之后我使用以下命令启动工人

脚本/延迟作业开始

耙工作:工作

我的工人开始了,在我的终端上我可以看到

[Worker(host:user1234-desktop pid:9487)] 启动工作工作者

现在我的问题是当我直接调用 perform 方法时它工作正常。我的意思是以下代码可以完美地抓取网站并填充数据库。

ruby-1.9.2-p0 > Dj_testing.new.perform

但是当我延迟同一份工作时,它会将工作添加到延迟工作表中并且什么都不做:(

ruby-1.9.2-p0 > Dj_testing.delay.new

或者

ruby-1.9.2-p0 > 延迟::Job.enqueue Dj_testing.new

 #<Delayed::Backend::ActiveRecord::Job id: 150, priority: 0, attempts: 0, handler: 
"---!ruby/object:Delayed::PerformableMethod \nargs: ...", last_error: nil,
run_at: "2012-04-27 05:25:29", locked_at: nil, failed_at: nil, locked_by: nil,
queue: nil,created_at:     "2012-04-27 05:25:29", updated_at: "2012-04-27 05:25:29"> 

为什么工作没有按预期工作?

4

2 回答 2

0

您需要在调用该方法的对象上调用“延迟”。所以,在你的情况下,它应该是:

Dj_testing.new.delay.perform

并不是

Dj_testing.delay.new
于 2012-04-28T15:55:12.013 回答
0

@salil 调用该方法的方式是正确的,但是您可能会遇到其他问题。

遵循我对这篇文章的回答中的指南(我没有在这里发帖,因为有很多:-)) https://stackoverflow.com/a/15000180/226255

我希望这有帮助

于 2013-02-21T10:46:20.610 回答