Rails / delayed_job - хотите загрузить самую новую версию класса задания - PullRequest
1 голос
/ 22 октября 2009

Я использую плагин delayed_job в Rails для фоновой обработки, и я испытываю сбой в «гибкой разработке», которую я до сих пор испытывал в Rails ...

Обычно в рельсах, если я сталкиваюсь с ошибкой / хочу добавить некоторые новые функции - я просто добавляю некоторый код и обновляю страницу, и новый код запускается.

При использовании delayed_job создается впечатление, что класс задания не перезагружается ... если задание не выполняется, и я иду и исправляю ошибку и снова запускаю задание, старый код запускается снова.

Есть ли способ заставить delayed_job загрузить самую последнюю версию класса задания перед его вызовом?

На всякий случай, это как-то связано с этим - я знаю, что у delayed_job есть несколько различных вариантов способов объявления заданий / выполнения заданий:

Мой класс заданий находится в каталоге lib Rails и объявлен как:

class FooJob < Struct.new(:foo_id)

и я вызываю задание следующим образом из контроллера:

Delayed::Job.enqueue(FooJob.new(params[:id]))

Ответы [ 2 ]

1 голос
/ 23 октября 2009

Нет ничего встроенного для этого. Как правило, вы несете ответственность за управление и перезагрузку своих работников. Это, вероятно, также хорошо, так как перезагрузка разработки Rails хороша, но не идеальна, и попытка автоматической перезагрузки отложенного задания потенциально может столкнуться с тонкими проблемами всех видов, которые будут довольно непрозрачны для отладки внутри рабочего процесса. Кроме того, если бы он автоматически перезагружал среду для каждой работы, многие варианты использования были бы чрезвычайно медленными в режиме разработки.

Я предлагаю просто привыкнуть к выполнению rake jobs:work, а затем Ctrl-C при внесении изменений. В качестве альтернативы вы можете создать сценарий, который просто вручную запускает задания на временной основе (взято из delayed_job docs ):

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'

Delayed::Worker.new.start  
0 голосов
/ 22 октября 2011

Я использую этот хак, который выглядит довольно неплохо, но имейте в виду, что он, вероятно, очень специфичен для Rails и delayed_job, поэтому вам, вероятно, придется изменить некоторые вещи. Протестировано с Rails 3.2.0 и delayed_job 2.1.4.

Поместите это, например. script/delayed_job_development и запустите его из корня 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

Пожалуйста, прокомментируйте, если вы знаете, что это очень плохая идея или вещи, о которых нужно знать, я в основном использую их при редактировании и тестировании заданий, которые запускаются сразу, а не заданий, запланированных на долгое время в будущем.

...