Resque
目前正在學習使用resque 、resque-scheduler來發布異步任務和定時任務,為了方便以后查閱,所以記錄一下。
resque和resque-scheduler其優點在於功能比較強大,可擴展性好,已有數個各種不同目的的擴展可用。使用redis作為消息隊列的存儲,比較與時俱進,與操作系統無綁定,完全在rails框架內運行,配置和使用簡單可理解。
resque是基於redis的后台任務組件,能把任何類或模塊作為任務在后台執行,且自帶前台管理功能,方便查看執行情況。
使用
1. 編寫任務
class WorkerClass
@queue = :run_task
def self.perform(args) //參數可以多個
........
puts "Doing something complex with #{args}"
end
end
2. 進入任務隊列
require "resque" Resque.enqueue(WorkerClass, args) //其中WorkerClass對應下面的任務類,args是傳給WorkerClass類的參數
3. 運行任務
與rails3整合
0. 配置redis
新增 config/redis.yml 文件,加入以下內容
defaults: &defaults host: localhost port: 6379 development: <<: *defaults test: <<: *defaults staging: <<: *defaults production: <<: *defaults
1. 加載resque
echo "require 'resque'" > config/initializers/load_resque.rb
config = YAML::load(File.open("#{Rails.root}/config/redis.yml"))[Rails.env]
Resque.redis = Redis.new(:host => config['host'], :port => config['port'])
2. 由於worker類都放在app/jobs,因此需要指定rails加載此目錄
修改 config/application.rb,加入以下內容
config.autoload_paths += %W(#{config.root}/app/jobs)
3. 加入rake任務
修改 @RakeFile@,加入以下內容
require ‘resque/tasks’ task “resque:setup” => :environment
第二句指明運行 resque:setup 前先初始化rails環境
運行resque后台任務
QUEUE=* rake resque:work
查看任務執行情況(用於調試)
#運行resque前台管理服務器 resque-web -p 8282 #打開瀏覽器,訪問 http://0.0.0.0:8282 #前台可以查看失敗的worker及其日志,可以手動執行retry操作
定時任務
如需定時執行任務,可以使用 resque-scheduler
測試
在測試的時候我們不需要測試過程與resque是異步的,否則resque執行的時候數據可能已經被清空了,使用resque_spec插件可以讓resque worker立即執行

