Rails / delayed_job - quer carregar mais nova versão da classe trabalho
-
05-07-2019 - |
Pergunta
Eu estou usando o plugin delayed_job no Rails para fazer o processamento de fundo, e eu estou experimentando um soluço no 'desenvolvimento ágil' Eu tenho experimentado até agora no Rails ...
Normalmente em trilhos se eu acertar um erro / querer adicionar algumas novas funcionalidades -. Eu só adicionar algum código e atualize a página e as pistas novo código
Com delayed_job, parece que a classe trabalho não está sendo recarregado ... se uma tarefa falhar e eu ir e corrigir o erro e disparar o trabalho novamente, o código antigo é executado novamente.
Existe alguma maneira de fazer carga delayed_job a versão mais recente da classe trabalho antes de invocá-lo?
Apenas no caso de isso não tem nada a ver com isso - eu sei delayed_job tem algumas opções diferentes nas maneiras de declarar empregos / trabalhos executados:
A minha turma de trabalho está no diretório lib do Rails e é declarado como:
class FooJob < Struct.new(:foo_id)
e estou invocando o trabalho como este a partir do controlador:
Delayed::Job.enqueue(FooJob.new(params[:id]))
Solução
Não há nada builtin fazer isso. Geralmente você é responsável pela gestão e recarregar os seus trabalhadores. Este é provavelmente tão bem desde o desenvolvimento Rails recarga é bom, mas não perfeito, e a tentativa de auto-reload um trabalho atrasado seria potencialmente correr em todas as questões tipo sutis que seria muito opaco para depuração dentro de um processo de trabalho. Além disso, se ele recarregado automaticamente o ambiente para cada trabalho um monte de casos de uso iria ficar tremendamente lento no modo desenv.
A minha sugestão é apenas para começar a usar fazendo rake jobs:work
e depois Ctrl-C
quando você faz alterações. Alternativamente, você pode criar um script que apenas executa manualmente os postos de trabalho numa base ad-hoc (retirado delayed_job docs ):
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'
Delayed::Worker.new.start
Outras dicas
Eu uso este hack que costuras para trabalhar bastante agradável, mas esteja ciente de que é provavelmente muito Rails e versão delayed_job específica para que você provavelmente precisará mudar algumas coisas. Testado com Rails 3.2.0 e 2.1.4 delayed_job.
Coloque isso em por exemplo script/delayed_job_development
e executá-lo a partir da raiz Rails.
#!/usr/bin/env ruby
require File.expand_path('../config/environment', File.dirname(__FILE__))
require 'delayed/worker'
require "rails/console/app"
class DummyConsoleClass
include Rails::ConsoleMethods
end
dummy_console = DummyConsoleClass.new
worker = Delayed::Worker.new({:quiet => false})
puts "Waiting for jobs..."
loop do
if Delayed::Job.find_available(worker.name).count > 0
puts "Found jobs"
dummy_console.reload!
loop do
break if worker.work_off.sum == 0
end
puts "Done, waiting for jobs..."
end
sleep(2)
end
Por favor, comente se você sabe que esta é uma idéia muito ruim ou coisas para estar ciente, eu usá-lo principalmente quando editar e testar os trabalhos que são executados imediatamente não com trabalhos agendados para executar muito tempo no futuro.