Подтвердить что ты не робот

Получение отложенной работы для регистрации

#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.

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

4b9b3361

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

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