在Rails里面实现延迟任务,选择Delayed Job 的 active record方案(使用active record,不需要额外安装软件支撑);
延迟任务数据保存在Rails active record适配的数据库中;
在新版本的Rails中,延迟任务已经统一接口到Rails Job框架中;直接使用Rails Job框架,配置delayed job适配器即可使用;
配置Gemfile
gem "daemons"
gem 'delayed_job'
gem 'delayed_job_active_record'
bundle install
配置config/application.rb
config.active_job.queue_adapter = :delayed_job
自定义worker选项
创建config/initializers/delayed_job_config.rb
Delayed::Worker.destroy_failed_jobs = false #如果任务执行失败,任务记录是否从数据库中删除
Delayed::Worker.sleep_delay = 60 #如果没有任务,后台worker休眠时间;也可以设置Delayed::Worker.delay_jobs = false 使worker不休眠
Delayed::Worker.max_attempts = 3 #任务失败后最大重试次数
Delayed::Worker.max_run_time = 10.minutes # 任务最大执行时间
Delayed::Worker.read_ahead = 10 #每次从数据库中取多少条任务数据
Delayed::Worker.default_queue_name = 'default' #默认队列名称
Delayed::Worker.delay_jobs = !Rails.env.test? #如果没有任务后台worker是否需要休眠,如果需要,将休息sleep_delay秒
Delayed::Worker.raise_signal_exceptions = :term # Delayed::Worker.raise_signal_exceptions = :term 进程终结的时候抛出SignalException;从而使得正在进行的任务中断和unlocked;从而该任务可以之后被其他worker重新执行
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) #Log信息
创建任务数据表结构
rails generate delayed_job:active_record
rake db:migrate
创建一个任务
rails generate job xxx
# 打开app/jobs/xxx_job.rb
...
def perform(*args)
Rails.logger.info("xxx job args is #{args}")
end
...
启动后台进程
RAILS_ENV=production bin/delayed_job start
#其他命令:
# RAILS_ENV=production bin/delayed_job restart
# RAILS_ENV=production bin/delayed_job stop
# 等等
测试
# rails c 后
XxxJob.set(wait:10.second).perform_later("Test job")
# 10秒后就会在log文件里面发现输出日志
参考资料
Rails 4.2 新增后端任务框架 - Active Job
Active Job Basics
delayed_job on github