2

我有这个初始化脚本,用于使用 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)

我期待它能够工作,因为这两种情况下的键都是相同的。有没有办法在不明确指定每个参数的情况下调用构造函数?

我试图"<<"=>nil从 yaml 文件中删除该行,但行为没有改变。

4

2 回答 2

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

似乎它期望一个符号:hostnot,字符串'host'实际上是您调用初始化程序的两种方式之间的唯一区别。尝试:

config = HashWithIndifferentAccess.new YAML.load_file('config/rabbitmq.yml')
于 2014-10-23T16:11:43.087 回答
1

可能的实现Bunny.new依赖于可以通过符号键访问选项的事实,但是您从YAML.load_file. 你可以通过使用来解决这个问题Hash#with_indifferent_access

$bunny = Bunny.new(config[Rails.env].with_indifferent_access)
于 2014-10-23T16:12:16.027 回答