gpt4 book ai didi

ruby-on-rails - DelayedJob Worker 未由 Rails 初始值设定项配置

转载 作者:行者123 更新时间:2023-12-05 05:12:13 34 4
gpt4 key购买 nike

什么是初始化 rails 应用程序状态的正确方法,以便 DelayedJob worker(以及 rails 应用程序)受到该初始化的影响?我在设置应用程序配置时遇到问题在我的 rails 初始化程序中,我的 DelayedJob 作业似乎不可见。

我有几个“服务”可观察对象/单例,我在 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 启动应用程序时会调用初始化器,但作业本身的代码必须从其他环境或上下文中运行?

编辑:演示问题的更简单方法:

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

编辑 2: 我在 DJ group 上问过这个问题并创建了一个小的 github 项目来演示这个问题:https://github.com/cechner/dj_test

最佳答案

Delayed Job 组的一位贴心的海报帮助了我:https://groups.google.com/forum/#!topic/delayed_job/hgZvJtydLWs

总而言之,默认情况下,开发模式下的 Rails 会对 app/ 目录中运行的所有代码执行“代码重新加载”。但是,它不会重新加载 config/initializers/ 目录中的代码。所以我的服务被重新加载(因此观察者被清除)但是协调这些服务的初始化(通过注册观察者)没有被重新运行。

我知道使用单例共享全局状态的问题,但我不确定在运行时编排服务的“正确”或社区认可的方法是什么。

目前我已经解决了以下问题:

# config/initializers/my_application_config.rb
module MyApplication
class Application < Rails::Application
# was previously doing config.after_initialize, but to_prepare seems to be called every time a reload happens
config.to_prepare do
ServiceOrchestrator.prepare
end
end
end

# app/services/service_orchestrator.rb
class ServiceOrchestrator
def self.prepare
# clear because this seems to be invoked twice every reload for some reason
ShopActivityService.instance.delete_observers

ShopActivityService.instance.add_observer(NotificationService.instance, func=:handle_shop_activity)
end
end

关于ruby-on-rails - DelayedJob Worker 未由 Rails 初始值设定项配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54808855/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com