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

StackOverflow https://stackoverflow.com/questions/1609586

Вопрос

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

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

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

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

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

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

class FooJob < Struct.new(:foo_id)

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

Delayed::Job.enqueue(FooJob.new(params[:id]))
Это было полезно?

Решение

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

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

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

Delayed::Worker.new.start  

Другие советы

Я использую этот хак, который выглядит довольно неплохо, но имейте в виду, что он, вероятно, очень специфичен для 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top