Получение отложенной работы для входа - PullRequest
22 голосов
/ 17 августа 2010
#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

Я не вижу сообщений журнала от отложенной работы в моих журналах рельсов или в файле журнала отложенных работ, единственные сообщения, которые я вижу, - это запуск / успешное выполнение / сбой в файле delayed_jobs.log.

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

Ответы [ 6 ]

8 голосов
/ 10 января 2011

Мы получили его для работы с 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.

6 голосов
/ 18 июля 2012

Это может быть простой обходной путь, но он работает достаточно хорошо для меня:

system("echo #{your message here} >> logfile.log")

Просто, но работает

4 голосов
/ 03 января 2012

я просто сделал это:

/config/environments/development.rb

MyApp::Application.configure do

 [...]


 [...]


 [...]

 Delayed::Worker.logger = Rails.logger

end

При каждом последующем запросе письмо будет отображаться в журнале.

ПРИМЕЧАНИЕ : иногда вам нужно обновить страницу, чтобы почта была записана в журнал. Не забудьте перезагрузить сервер;)

4 голосов
/ 29 августа 2011

У меня это работает со следующей настройкой в ​​инициализаторе:


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


1 голос
/ 28 марта 2013

Задержка задания не выводится, если что-то не так:

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, чтобы проверить, работает ли он

Надеюсь, это поможет вам, ребята: -)

0 голосов
/ 10 мая 2013

Не забудьте изменить 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 "ставит", SQL запросов и статус работы

...