Задержка задания: как перезагрузить классы полезной нагрузки при каждом вызове в режиме разработки - PullRequest
13 голосов
/ 05 февраля 2011

Я работаю с отсрочкой.Когда бы я ни вызывал метод foo, рабочий печатает hello.

class User
  def foo
    puts "Hello"
  end
  handle_asynchronously :foo
end

Если я внесу некоторые изменения в метод foo, мне придется перезапустить работника, чтобы изменения отразились.В режиме разработки это может стать довольно утомительным.

Я пытаюсь найти способ перезагрузить класс полезной нагрузки (в данном случае класс пользователя) для каждого запроса.Я попытался обезьянить патч библиотеки DelayedJob для вызова require_dependency перед вызовом метода полезной нагрузки.

module Delayed::Backend::Base
  def payload_object_with_reload
    if Rails.env.development? and @payload_object_with_reload.nil?
      require_dependency(File.join(Rails.root, "app", "models", "user.rb"))
    end
    @payload_object_with_reload ||= payload_object_without_reload
  end
  alias_method_chain :payload_object, :reload
end

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

Кто-нибудь пробовал это раньше?Как бы вы посоветовали мне продолжить?Или у вас есть указатели для поиска кода перезагрузки класса Rails?

Ответы [ 3 ]

19 голосов
/ 05 февраля 2011

Мне удалось найти решение. Я использовал ActiveSupport::Dependencies.clear метод для очистки загруженных классов.

Добавить файл с именем config/initializers/delayed_job.rb

Delayed::Worker.backend = :active_record
if Rails.env.development?
  module Delayed::Backend::Base
    def payload_object_with_reload
      if @payload_object_with_reload.nil?
        ActiveSupport::Dependencies.clear
      end
      @payload_object_with_reload ||= payload_object_without_reload
    end
    alias_method_chain :payload_object, :reload
  end
end
1 голос
/ 04 ноября 2016

Начиная с версии 4.0.6, DelayedJob перезагружается автоматически, если для Rails.application.config.cache_classes установлено значение false:

В режиме разработки, если вы используете Rails 3.1+, код вашего приложения будет автоматическиперезагрузите каждые 100 заданий или когда очередь заканчивается.Вам больше не нужно перезапускать отложенную работу каждый раз, когда вы обновляете свой код в разработке.

0 голосов
/ 08 октября 2013

Похоже, что это решит вашу проблему без хакерства alias_method:

https://github.com/Viximo/delayed_job-rails_reloader

...