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]))
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top