在Rails里面實現(xiàn)延遲任務,選擇Delayed Job 的 active record方案(使用active record,不需要額外安裝軟件支撐)昂验;
延遲任務數據保存在Rails active record適配的數據庫中缘滥;
在新版本的Rails中,延遲任務已經統(tǒng)一接口到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選項
創(chuàng)建config/initializers/delayed_job_config.rb
Delayed::Worker.destroy_failed_jobs = false #如果任務執(zhí)行失敗旭贬,任務記錄是否從數據庫中刪除
Delayed::Worker.sleep_delay = 60 #如果沒有任務怔接,后臺worker休眠時間;也可以設置Delayed::Worker.delay_jobs = false 使worker不休眠
Delayed::Worker.max_attempts = 3 #任務失敗后最大重試次數
Delayed::Worker.max_run_time = 10.minutes # 任務最大執(zhí)行時間
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重新執(zhí)行
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) #Log信息
創(chuàng)建任務數據表結構
rails generate delayed_job:active_record
rake db:migrate
創(chuàng)建一個任務
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文件里面發(fā)現(xiàn)輸出日志
參考資料
Rails 4.2 新增后端任務框架 - Active Job
Active Job Basics
delayed_job on github