Задержка задания не выводится, если что-то не так:
1- Неактивные классы записей должны быть обязательными и инициализированы:
Как:
Создайте файл config / initializers / load_classes_for_dj.rb
Добавьте к этому строки:
require 'lib/libtest/delayed_test.rb'
DelayedTest
Обратите внимание, что если у вас есть '# {config.root} / lib / libtest' в config.autoload_paths в config / application.rb, вам не нужно выполнять требование.
Источник:
Rails Delayed Job & Library Class
2- Классы, которые реализуют модуль Singleton, не будут работать, вызывая:
SingletonClass.instance.delay.sayhello
Чтобы это исправить, сделайте следующее:
class SingletonClass
include Singleton
# create a class method that does the call for you
def self.delayed_sayhello
SingletonClass.instance.sayhello
end
def sayhello
# this is how you can actually write to delayed_job.log
# https://stackoverflow.com/questions/9507765/delayed-job-not-logging
Delayed::Worker.logger.add(Logger::INFO, "hello there")
end
end
Чтобы вызвать метод отложенного класса, выполните следующие действия:
SingletonClass.delay.delayed_sayhello
Да, я звоню. Задержка в классе здесь. Так как классы в Ruby также являются объектами, вызов здесь допустим и позволяет мне получить доступ к методу класса «delayed_sayhello»
3- Не передавайте объекты ActiveRecord или некоторые сложные объекты на ваш вызов, а передавайте идентификаторы, ищите объекты в базе данных в вашем отложенном методе, а затем выполняйте свою работу:
НЕ ДЕЛАЙТЕ:
DelayedClass.new.delay.do_some_processing_on_album Album.first
ЭТО ВМЕСТО:
DelayedClass.new.delay.do_some_processing_on_album Album.first.id
и внутри DelayedClass do_some_processing_on_album, do
a = Album.find_by_id id
Был пост об переполнении стека об этом, который я видел некоторое время назад - не уверен, что: -)
4- Для завершения, это, как сделать почтовые программы (не вызывать метод доставки):
Notifier.delay.signup(user_id)
Согласно пункту 3, не передавайте объект пользователя, а скорее его идентификатор, выполните поиск внутри метода регистрации.
Теперь, когда вы убедились, что выполнили приведенные выше рекомендации , вы можете использовать:
Delayed::Worker.logger.add(Logger::INFO, "hello")
Если вы все еще сталкиваетесь с проблемами, я предлагаю вам разобрать вашу проблему:
a- Создать новый класс
б- Убедитесь, что он включен и инициализирован в соответствии с шагом 1
c- Добавьте запись из шага 4 и попробуйте вызвать MyNewClass.new.delay, чтобы проверить, работает ли он
Надеюсь, это поможет вам, ребята: -)