我正在编写一个分布式系统,其中一个工作人员执行某项工作,并且为了启动工作人员,启动init.rb
,它会加载lib
文件夹并执行一些配置。
init.rb
lib
|-- modulename
| |-- foo.rb
| |-- configuration.rb
| `-- worker.rb
`-- modulename.rb
$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
require "bundler/setup"
require "modulename"
ModuleName.configure do |c|
c.log = "module.log"
c.pool_size = 10
end
require "sidekiq"
require "modulename/foo"
require "modulename/configuration"
require "modulename/worker"
module ModuleName
def self.config
@config ||= Configuration.new
end
def self.configure
yield(config)
end
end
module ModuleName
class Worker
include Sidekiq::Worker
REDIS_POOL = ConnectionPool.new(:size => ModuleName.config.pool_size, :timeout => 3) { Redis.new }
def dosomething
# ...
end
end
end
如果我现在运行ruby init.rb
,我会收到NoMethodError:<class:Worker>: undefined method config for ModuleName:Module (NoMethodError)
我真的不明白为什么,请给我一个如何解决这个问题的提示!
答案 0 :(得分:1)
在modulename.rb中你需要worker.rb,所以ruby会关闭并运行该文件中的代码,包括你设置REDIS_POOL
的位,它试图调用Modulename.config
Modulename.config
尚未定义(您只在modulename.rb的底部执行此操作,因此错误。
您可能只想懒洋洋地创建redis池,或者至少在配置更新后创建redis池。