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)

どちらの場合もキーは同じなので、うまくいくと思っていました。各パラメーターを明示的に指定せずにコンストラクターを呼び出す方法はありますか?

"<<"=>nilyaml ファイルから行を削除しようとしましたが、動作は変わりませんでした。

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

イニシャライザを呼び出す2つの方法の実質的な唯一の違いである:host文字列ではなく、シンボルを期待しているようです。'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 に答える