3

Rails でRabbitMQ とruby​​-amqpを使用しています。コントローラーがメッセージを受信すると、次のことを実行します。

def create 
  AMQP.start("amqp://localhost:5672") do |connection|
    channel  = AMQP::Channel.new(connection)
    exchange = channel.direct("")
    exchange.publish("some msg", :routing_key => "some key")

    EventMachine.add_timer(2) do
      exchange.delete
      connection.close { EventMachine.stop }
    end
  end
end
  1. startリクエストが来るたびに呼び出す必要がないように、AMQP 接続を開いたままにしておく方法はありますか?

Rabbit MQ への接続を開くのは非効率的だと思いますが、永続的な接続にコード ブロックを渡す方法が見つかりませんでした。

4

1 に答える 1

1

AMQP 接続を開いたままにしておくだけの場合は、グローバル変数を設定して、接続を一意に保つようにしてください。

def start_em
  EventMachine.run do
    $connection = AMQP.connect(CONNECTION_SETTING) unless $connection
    yield
  end
end

def publish(message, options = {})
  start_em {
    channel  = AMQP::Channel.new($connection)           
    exchange = channel.direct('')                          
    exchange.publish(message, {:routing_key => 'rails01'}.merge(options))
    EventMachine.add_timer(1) { exchange.delete }        
  }
end

メッセージを破棄した後は、チャンネルを削除することを忘れないでください。

于 2012-12-12T04:09:26.283 に答える