ruby-on-rails - 通过在应用程序启动时启动工作人员来初始化延迟作业 gem

标签 ruby-on-rails ruby ruby-on-rails-3 initialization delayed-job

我正在使用 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

但是,由于我总是希望在应用程序启动时启动工作人员,因此在我的 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

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

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

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


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


@Devin M

更新

我的 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

最佳答案

我不认为你可以那样做,因为当你启动'/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

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

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

关于ruby-on-rails - 通过在应用程序启动时启动工作人员来初始化延迟作业 gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994479/

相关文章:

mysql - RoR数据库错误

ruby-on-rails - ActiveRecord 对象相等

ruby - 比较 2 个数组,每个数组包含 200,000 多个值

ruby - 为什么条件包含停止在 Jekyll 中工作,除非我添加非空白字符?

ruby-on-rails-3 - Capybara 2.0.0.beta4 有未定义的路径

ruby-on-rails - 可以在 Rails 3.2 中基于每个请求禁用 Rack 缓存吗?

ruby-on-rails - 使用 Kaminari 分页跳转到中间

ruby - 是否有适合轨道调查的 gem ?

ruby - 在循环中创建子进程时如何与父进程进行 IPC (Ruby)

ruby-on-rails - Rails 5 Active Record 记录无效错误