2013-08-23 54 views
2

我有一个基于Web的应用程序,我使用Sinatra构建。从最近我需要定期收集数据并将它们存储在数据库中。为此我被告知可以使用ResqueClockwork宝石。Resque - 不处理队列

每个小时左右我需要根据数据库进行近15次计算并将结果存储在数据库中。

所以这是我采取的方法。我决定制作15个具有perform方法的类(我用于测试的确切文件如下)。然后为所有15个班级做类似Resque.enqueue(GraphData)的事情。

class GraphData 

    @queue = :graph_data 

    def self.init() 

    end 

    def self.perform() 
    File.open('/home/ziyan/Desktop/resque.txt', 'a') { | file | file.write("Resqueu - performed - #{Time.now}\n") } 
    end 

end 

为了触发操作以进行测试,我创建了一个rake任务。

desc "Start Resque Workers for Queue" # {{{ 
task :graph_data do |t| 

    ENV["QUEUE"]  = "*" 
    ENV["VVERBOSE"] = "1" 
    ENV["INTERVAL"] = "5" 

    Resque.enqueue(GraphData) 
    #resque = Resque.new 
    #resque << AdminWorker.new 
end # }}} 

正如你看到的,在GraphData类,下self.perform方法,我写一个文件。

我的问题是它不是!我做错了什么?

rake graph_data将不显示输出。 Web界面将在Queue中显示作业。

其他信息

我添加了另一个Rake任务运行的Web界面。

desc "Start Resque Web Frontend" # {{{ 
task :resque_web_frontend do |t| 
    sh "resque-web -p 8282" 
    puts "Resque Web Frontend is running on http://localhost:8282" 
end # }} 

在他们看来,有些有趣的事情。当我运行rake任务时,在stats下,pending值增加但未处理。

在队列下 - > graph_data我看到这样的事情。

Class Args 
GraphData [] 
GraphData [] 
GraphData [] 

我最终什么了

desc "Start Resque Workers for Queue" # {{{ 
task :graph_data do |t| 

    ENV["QUEUE"]  = "*" 
    ENV["VVERBOSE"] = "1" 
    ENV["INTERVAL"] = "5" 

    Rake::Task[ "resque:work" ].invoke 
    Resque.enqueue(GraphData) 
    #resque = Resque.new 
    #resque << AdminWorker.new 
end # }}} 

回答

5

这是在开发或生产?从你所描述的,看起来你并没有开发Resque过程。你如何运行你的应用程序?我更熟悉Resque with Rails,但您应该运行如下类似的操作:

rake resque:work QUEUE='*' 

让resque worker启动。

+0

噢呀......你是对的......我还有一个问题。当我运行rake任务时,它说5秒钟......等待5秒钟等等,然后重复。这是什么重复?它不重复任务。所以这就是我需要使用'Clockwork'来完成每小时任务的地方? –

+0

不确定,但可能是Resque工作人员每5秒轮询一次以查看是否有某件事要做(即查看队列以查看是否有工作要选择)。您可以使用resque_scheduler gem让作业以固定间隔运行。 – Martin

+0

对于任何有加载错误的人,请使用:'QUEUE = * rake environment resque:work' –