Инициализируйте гем Delayed Jobs, запустив рабочих при запуске приложения - PullRequest
1 голос
/ 09 августа 2011

Я использую Ruby on Rails 3.0.9 и пытаюсь установить гем delay_job .Все работает, если после перезагрузки сервера 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 не работает должным образом.То есть, он не обрабатывает задания, как это происходит, когда я запускаю вышеуказанные командные строки в Terminal \ Console.

Как я могу заставить DJ работать правильно?В чем проблема?

PS: Я хотел бы сделать это для автоматизации процессов.


Похоже, что приведенный выше код в файле config/initializers/delayed_job.rb не't' создавать "файлы" pids ", связанные с DJ, в каталоге RAILS_ROOT/tmp/pids.Они создаются только путем запуска указанных командных строк вручную.Почему это происходит?


ОБНОВЛЕНИЕ для @ Девин М

Мой 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

Ответы [ 3 ]

5 голосов
/ 20 сентября 2012

Я не думаю, что вы можете сделать это, потому что когда вы запускаете '/ 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 запускается в фоновом режиме, в отдельном процессе, чем рельсы.Последующие вызовы rake пропустят запуск delayed_jobs, если он уже запущен.У вас все еще будут проблемы, если по какой-то причине этот файл не будет удален после завершения delayed_jobs.

Состояние command / script / delayed_job определит, так ли это, но вы не можете запустить его внутриэтот файл 'config / initializers / delayed_job.rb', потому что это вызовет бесконечный цикл: (

1 голос
/ 12 мая 2014

У меня была проблема, когда инициализировался процесс delayed_job, хотя его инициализаторы выполнялись до создания pid-файла (т. Е. Delayed_job.pid в случае одного работника и delayed_job.0.pid delayed_job.1.pid и т. Д. В случае многих работники)

Итак, я решил создать свой собственный файл блокировки следующим образом:

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

workers = 2


if Rails.env.production? || Rails.env.development?
  # Check if the delayed job process is already running
  # Since the process loads the rails env, this file will be called over and over
  # Unless this condition is set.
  pids = Dir.glob(Rails.root.join('tmp','pids','*'))

  system "echo \"delayed_jobs INIT check\""
  if pids.select{|pid| pid.start_with?(Rails.root.join('tmp','pids','delayed_job.init').to_s)}.empty?

    f = File.open(Rails.root.join('tmp','pids','delayed_job.init'), "w+") 
    f.write(".")
    f.close
    system "echo \"Restatring delayed_jobs...\""
    system "RAILS_ENV=#{Rails.env} #{Rails.root.join('bin','delayed_job')} stop"
    system "RAILS_ENV=#{Rails.env} #{Rails.root.join('bin','delayed_job')} -n #{workers} start"
    system "echo \"delayed_jobs Workers Initiated\""
    File.delete(Rails.root.join('tmp','pids','delayed_job.init')) if File.exist?(Rails.root.join('tmp','pids','delayed_job.init'))

  else
    system "echo \"delayed_jobs is running\""
  end
end

файл: config \ initializers \ delayed_job.rb

Примечание: не будет работать для Windows!

1 голос
/ 09 августа 2011

Попробуйте использовать этот код:

system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} stop"
system "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} -n 2 start"

Тестирование в консоли привело к выводу о том, что он должен работать:

Loading development environment (Rails 3.0.9)
ruby-1.9.2-p290 :001 > Rails.root.join('script','delayed_job')
 => #<Pathname:/home/devin/testsoapp/script/delayed_job> 
ruby-1.9.2-p290 :002 > "RAILS_ENV=production #{Rails.root.join('script','delayed_job')} -n 2 start"
 => "RAILS_ENV=production /home/devin/testsoapp/script/delayed_job -n 2 start" 
ruby-1.9.2-p290 :003 > 
...