Как я могу оставить соединение AMQP открытым при использовании Ruby-Amqp?

Я использую RabbitMQ и ruby-amqp с Rails. Когда сообщение получено контроллером, я выполняю следующее:

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. Есть ли способ оставить соединение AMQP открытым, чтобы мне не приходилось вызывать start каждый раз, когда приходит запрос?

Я предполагаю, что открытие соединения с Rabbit MQ неэффективно, однако я не нашел способа передать блок кода в постоянное соединение.


person austen    schedule 31.05.2012    source источник
comment
вы определенно правы здесь, открывая соединение каждый раз, когда вы хотите что-то отправить, очень неэффективно. Недостаточно знаком с рубином, чтобы предложить, как это сделать.   -  person robthewolf    schedule 31.05.2012


Ответы (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

И не забудьте удалить канал после публикации сообщения.

person big-circle    schedule 12.12.2012