Получение отложенной работы для регистрации
#Here is how I have delayed job set up.
Delayed::Worker.backend = :active_record
#Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/
##{Rails.env}_delayed_jobs.log", Rails.logger.level)
Delayed::Worker.logger.auto_flushing = 1
class Delayed::Job
def logger
Delayed::Worker.logger
end
end
if JobsCommon::check_job_exists("PeriodicJob").blank?
Delayed::Job.enqueue PeriodicJob.new(), 0, 30.seconds.from_now
end
#end
#Here is my simple job.
class PeriodicJob
def perform
Rails.logger.info "Periodic job writing #{Time.now}"
Delayed::Job.enqueue PeriodicJob.new(), 0,
30.seconds.from_now
end
end
Я не вижу сообщений журнала из отложенного задания в моих журналах rails или файла журнала замедленного задания, единственными сообщениями, которые я вижу, являются задание start/success/failure в файле delayed_jobs.log.
Это вызывает большие проблемы, в том числе обнаружение ошибок и утечек памяти у рабочих практически невозможно! Пожалуйста, помогите!
Ответы
Ответ 1
Мы работаем над Rails 3/Delayed Job 2.0.3, взломав Rails.logger, чтобы использовать другой файл журнала (тот, который мы хотим для записей delayed_job), а также установить задержанный регистратор заданий на использование точно такой же объект:
file_handle = File.open("log/#{Rails.env}_delayed_jobs.log", (File::WRONLY | File::APPEND | File::CREAT))
# Be paranoid about syncing, part #1
file_handle.sync = true
# Be paranoid about syncing, part #2
Rails.logger.auto_flushing = true
# Hack the existing Rails.logger object to use our new file handle
Rails.logger.instance_variable_set :@log, file_handle
# Calls to Rails.logger go to the same object as Delayed::Worker.logger
Delayed::Worker.logger = Rails.logger
Если приведенный выше код не работает, попробуйте заменить Rails.logger
на RAILS_DEFAULT_LOGGER
.
Ответ 2
Это может быть простой способ обхода, но он работает достаточно хорошо для меня:
system("echo #{your message here} >> logfile.log")
Простой, но работает
Ответ 3
У меня есть работа со следующей установкой в инициализаторе:
require 'delayed/worker'
Delayed::Worker.logger = Rails.logger
module Delayed
class Worker
def say_with_flushing(text, level = Logger::INFO)
if logger
say_without_flushing(text, level)
logger.flush
end
end
alias_method_chain :say, :flushing
end
end
Ответ 4
я просто сделал это:
/config/environments/development.rb
MyApp::Application.configure do
[...]
[...]
[...]
Delayed::Worker.logger = Rails.logger
end
В каждом следующем запросе вы будете отправлять почту в журнал.
ПРИМЕЧАНИЕ. Иногда вам необходимо обновить страницу до того, как почта будет записана в журнал. Не забудьте перезапустить сервер;)
Ответ 5
DelayedJob не выводится, если что-то не так:
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 Задержка заданий и класс библиотеки
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
Да, я звоню .delay на класс здесь. Поскольку классы в 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
У меня была запись stackoverflow об этом, что я видел некоторое время назад - не знаю, что: -)
4- Для завершения, как это сделать почтовые программы (не называйте метод доставки):
Notifier.delay.signup(user_id)
В соответствии с 3, не пропускайте пользовательский объект, а скорее их идентификатор, выполните поиск внутри метода регистрации.
Теперь, как только вы убедитесь, что соблюдали рекомендации выше, вы можете использовать:
Delayed::Worker.logger.add(Logger::INFO, "hello")
Если вы все еще сталкиваетесь с проблемами, я предлагаю вам решить вашу проблему:
a- Создать новый класс
b- Убедитесь, что он включен и инициализирован в соответствии с шагом 1
c- Добавьте запись с шага 4 и попробуйте позвонить MyNewClass.new.delay, чтобы узнать, работает ли она
Надеюсь, это поможет вам, ребята: -)
Ответ 6
Не забудьте изменить ActiveRecord:: Base.logger
Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600)
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/)
ActiveRecord::Base.logger = Delayed::Worker.logger
end
Более подробный ответ: Имеют журнал delayed_job & puts ", sql-запросы и статус заданий