我有这个初始化脚本,用于使用Bunny设置我的RabbitMq连接:
require 'yaml'
config = YAML.load_file('config/rabbitmq.yml')
puts config[Rails.env]
# $bunny = Bunny.new(config[Rails.env])
$bunny = Bunny.new(:host => config[Rails.env]["host"],
:vhost => config[Rails.env]["vhost"],
:user => config[Rails.env]["user"],
:password => config[Rails.env]["password"],
)
$bunny.start
$bunny_channel = $bunny.create_channel
config[Rails.env]
的内容是:
{"<<"=>nil, "host"=>"spotted-monkey.rmq.cloudamqp.com", "user"=>"myuser", "password"=>"mypassord", "vhost"=>"myvhost"}
Bunny.new
命令的详细语法正常工作。但是,当我注释掉详细块时,请保留以下语法:
$bunny = Bunny.new(config[Rails.env])
我收到以下错误消息:
session.rb:296:in `rescue in start': Could not establish TCP connection to any of the configured hosts (Bunny::TCPConnectionFailedForAllHosts)
我期待它能够正常工作,因为在这两种情况下密钥都相同。有没有办法调用构造函数而不明确指定每个参数?
我尝试从yaml文件中删除"<<"=>nil
行,但行为没有变化。
答案 0 :(得分:1)
查看源代码后我发现了这个:
def hostnames_from(options)
options.fetch(:hosts_shuffle_strategy, @default_hosts_shuffle_strategy).call(
[ options[:hosts] || options[:host] || options[:hostname] || DEFAULT_HOST ].flatten
)
end
似乎期待符号:host
不是,字符串'host'
这实际上是您调用初始值设定项的两种方式之间的唯一区别。尝试:
config = HashWithIndifferentAccess.new YAML.load_file('config/rabbitmq.yml')
答案 1 :(得分:1)
Bunny.new
的实现可能依赖于可以通过符号键访问选项的事实,但是您可以从YAML.load_file
获取字符串键。您可以使用Hash#with_indifferent_access
$bunny = Bunny.new(config[Rails.env].with_indifferent_access)