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立即执行