rails instalar gems espaƱol ruby-on-rails ruby ruby-on-rails-3 initialization delayed-job

ruby on rails - instalar - Inicialice la gema de Trabajos diferidos iniciando los trabajadores al inicio de la aplicaciĆ³n



ruby installer (3)

Intenta usar este código:

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

Probarlo en la consola produjo esta salida que indica que debería funcionar:

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 >

Estoy usando Ruby on Rails 3.0.9 y estoy tratando de configurar la gema delay_job . Todo funciona si, después de reiniciar el servidor Apache2, ejecuto en la Terminal / Console los siguientes comandos:

RAILS_ENV=development script/delayed_job stop RAILS_ENV=development script/delayed_job -n 2 start

Sin embargo, dado que siempre quiero iniciar los trabajadores en el inicio de la aplicación, en mi config/initializers/delayed_job.rb agrego el siguiente código (que maneja tanto el modo de desarrollo como el de producción):

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

Sin embargo, al usar el código anterior y luego de reiniciar el servidor Apache2, la gema DJ ya no funciona como se esperaba. Es decir, no procesa trabajos como lo hace cuando ejecuto las líneas de comando anteriores en Terminal / Console.

¿Cómo puedo hacer que DJ funcione correctamente? ¿Cuál es el problema?

PD: me gustaría hacer eso para automatizar los procesos.

Parece que el código anterior en el archivo config/initializers/delayed_job.rb no "crea" los archivos "pids" relacionados con DJ en el directorio RAILS_ROOT/tmp/pids . Esos son creados solo al ejecutar las líneas de comando arriba manualmente. ¿Por qué sucede esto?

ACTUALIZACIÓN para @Devin M

Mi config/initializers/delayed_job.rb contiene:

# 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


No creo que puedas hacer eso porque cuando inicias el ''/ script / delayed_job'', se cargará el entorno de los rieles, haciendo que el archivo ''config / initializers / delayed_job.rb'' se ejecute de nuevo. Puedes ver que esto da como resultado un ciclo infinito. Además, cada vez que invoque un rake, por ejemplo: ''rake db: migrate'', inicializaría retrayed_jobs.

Puedes hackearlo con esto:

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

Con ''&'', el script de retraso de trabajo se ejecuta en segundo plano, en un proceso separado de los rieles. Las llamadas subsiguientes a rake omitirán el lanzamiento de demoyed_jobs si ya se está ejecutando. Todavía tendrá algunos problemas si, por alguna razón, ese archivo no se elimina cuando se cancela el proceso.

El estado del comando / script / delayed_job detectará si ese es el caso, pero no puede ejecutarlo dentro de este archivo ''config / initializers / delayed_job.rb'' porque causaría un bucle infinito :(


Tuve un problema donde el proceso de inicialización de trabajo retrasado se estaba ejecutando a través de sus inicializadores antes de crear el archivo pid (es decir, retaryed_job.pid en el caso de un solo trabajador y retaryed_job.0.pid delayyed_job.1.pid etc. en el caso de muchos trabajadores)

Así que recurrí a crear mi propio archivo de bloqueo como tal:

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

file: config / initializers / delayed_job.rb

Nota: ¡no funcionará para Windows!