gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:18:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com