Rails Job 配置Delayed Job使用

在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

你可能感兴趣的:(Rails Job 配置Delayed Job使用)