0

我正在编写一个分布式系统,其中一个工作人员执行一些工作,为了启动工作人员,启动了一个init.rb加载lib文件夹并执行一些配置的工作人员。

结构

init.rb
lib
|-- modulename
|   |-- foo.rb
|   |-- configuration.rb
|   `-- worker.rb
`-- modulename.rb

初始化.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

模块名.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

工人.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我会得到一个 NoMethodError:<class:Worker>: undefined method config for ModuleName:Module (NoMethodError)

我真的不明白为什么,请给我一个提示如何解决这个问题!

4

1 回答 1

1

在 modulename.rb 中,您需要 worker.rb,因此 ruby​​ 启动并运行该文件中的代码,包括您设置的位 REDIS_POOL,它试图调用Modulename.config

Modulename.config尚未定义(您只在 modulename.rb 的底部这样做,因此会出现错误。

您可能只想懒惰地创建 redis 池,或者至少在配置更新之后。

于 2013-01-07T22:52:32.167 回答