我正在编程一个分布式系统,其中工作人员执行一些工作,为了启动工作人员,启动了init.rb
,它加载lib
文件夹并执行一些配置。
init.rb
lib
|-- modulename
| |-- foo.rb
| |-- configuration.rb
| `-- worker.rb
`-- modulename.rb
init.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
modulename.rb
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
worker.rb
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
,我得到一个noomethoderror: <class:Worker>: undefined method config for ModuleName:Module (NoMethodError)
In modulename。你需要工人。所以ruby开始运行该文件中的代码,包括您设置REDIS_POOL
的位,它试图调用Modulename.config
Modulename.config
还没有定义(您只在modulename的底部定义)。
你可能只想惰性地创建redis池,或者至少在配置更新后。