我有一個基於Web的應用程序,我使用Sinatra構建。從最近我需要定期收集數據並將它們存儲在數據庫中。爲此我被告知可以使用Resque
和Clockwork
寶石。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 # }}}
噢呀......你是對的......我還有一個問題。當我運行rake任務時,它說5秒鐘......等待5秒鐘等等,然後重複。這是什麼重複?它不重複任務。所以這就是我需要使用'Clockwork'來完成每小時任務的地方? –
不確定,但可能是Resque工作人員每5秒輪詢一次以查看是否有某件事要做(即查看隊列以查看是否有工作要選擇)。您可以使用resque_scheduler gem讓作業以固定間隔運行。 – Martin
對於任何有加載錯誤的人,請使用:'QUEUE = * rake environment resque:work' –