Как правильно инициализировать состояние приложения rails, чтобы на эту инициализацию влияли работники DelayedJob (а также приложение rails)? У меня возникают проблемы при настройке конфигурации приложения вмои инициализаторы rails, кажется, не видны для моих заданий DelayedJob.
У меня есть несколько наблюдаемых / синглетов 'service', которые я организовываю в инициализаторе rails, как (это надуманный пример):
# my_app_initializer.rb
puts 'initializing my app...' # this DOES get logged in DJ worker
ShopActivityService.instance.add_observer(NotificationService.instance, func=:handle_shop_activity)
# if someone calls ShopActivityService.do_activity(), notification service sends an email
Идея состоит в том, что всякий раз, когда происходит какая-либо «активность в магазине», «служба уведомлений» отправляет электронное письмо или что-то в этом роде.
Проблема заключается в в том, что при задержке работырабочий вызывает ShopActivityService
, служба NotificationService, по-видимому, не зарегистрирована в качестве наблюдателя и поэтому не получает уведомления.
Я заметил, что инициализатор вызывается, когда я запускаю приложение с rails jobs:work
,но код в самом задании должен быть запущен из какой-либо другой среды или контекста?
edit: simpЕще один способ демонстрации проблемы:
# my_job.rb
class MyJob
@@x = 0
def self.inc_x
@@x = @@x + 1
end
def self.print_x
puts "x is #{@@x}"
end
def self.schedule_job
new.delay.execute_job
end
def execute_job
self.class.print_x
end
end
# my_job_initializer.rb
MyJob.inc_x
, затем в rails console
это приводит к неожиданным результатам:
MyJob.print_x
# prints 'x is 1' as expected
MyJob.schedule_job
# the delayed job worker process prints 'x is 0'
edit 2: Я задал этот вопросв DJ group и создали небольшой проект github, демонстрирующий проблему: https://github.com/cechner/dj_test