通过在应用程序启动时启动工作程序来初始化延迟作业gem

Bac*_*cko 1 ruby initialization ruby-on-rails delayed-job ruby-on-rails-3

我正在使用Ruby on Rails 3.0.9,我正在尝试设置delay_job gem.如果在重新启动Apache2服务器后,我在Terminal\Console中运行以下命令,则一切正常:

RAILS_ENV=development script/delayed_job stop
RAILS_ENV=development script/delayed_job -n 2 start
Run Code Online (Sandbox Code Playgroud)

但是,由于我总是希望在应用程序启动时启动worker,在我config/initializers/delayed_job.rb添加以下代码(处理开发和生产模式):

if Rails.env.development?
  system 'RAILS_ENV=development script/delayed_job stop'
  system 'RAILS_ENV=development script/delayed_job -n 2 start'
elsif Rails.env.production?
  system 'RAILS_ENV=production script/delayed_job stop'
  system 'RAILS_ENV=production script/delayed_job -n 2 start'
end
Run Code Online (Sandbox Code Playgroud)

但是,通过使用上面的代码并在重新启动Apache2服务器之后,DJ gem不再按预期工作.也就是说,当我在Terminal\Console中运行上述命令行时,它不处理作业.

如何让DJ正常工作?问题是什么?

PS:我想这样做是为了使流程自动化.


它接收config/initializers/delayed_job.rb文件中的上述代码不会"创建"与RAILS_ROOT/tmp/pids目录中的DJ相关的"pids"文件.这些只能通过手动运行上述命令行来创建.为什么会这样?


UPDATE@Devin中号

我的config/initializers/delayed_job.rb包含:

# Options
Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 2
Delayed::Worker.max_attempts = 5
Delayed::Worker.max_run_time = 1.hour
Delayed::Worker.delay_jobs = !Rails.env.test?

if Rails.env.development?
  system "RAILS_ENV=development #{Rails.root.join('script','delayed_job')} stop"
  system "RAILS_ENV=development #{Rails.root.join('script','delayed_job')} -n 2 start"
elsif Rails.env.production?
  system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} stop"
  system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} -n 2 start"
end
Run Code Online (Sandbox Code Playgroud)

Nun*_*lva 5

我不认为你可以这样做,因为当你启动'/ script/delayed_job'时,将加载rails环境,导致'config/initializers/delayed_job.rb'文件再次被执行.您可以在无限循环中看到此结果.每次调用rake时,例如:'rake db:migrate',它都会初始化delayed_jobs.

你可以用这个来解决它:

if Rails.env.production?
  if(!File.exists?(Rails.root.join('tmp','pids', 'delayed_job.pid')))
    system "echo \"Starting delayed_jobs...\""
    system "./script/delayed_job start &"
  else
    system "echo \"delayed_jobs is running\""
  end
end
Run Code Online (Sandbox Code Playgroud)

使用'&',delayed_job脚本在后台运行,与rails不同.如果已经运行,对rake的后续调用将跳过启动delayed_jobs.如果由于某种原因,在delayed_jobs终止时未删除该文件,您仍会遇到一些问题.

命令/ script/delayed_job状态将检测是否是这种情况,但你不能在这个'config/initializers/delayed_job.rb'文件中运行它,因为它会导致无限循环:(