当我尝试使用connection.close约定时,AMQP似乎阻止了sinatra app

时间:2013-07-10 23:01:56

标签: ruby sinatra amqp

我们有一个非常简单的sinatra应用程序,它接收来自一个单独的Rails应用程序的POST请求的传入“订单”。它需要将订单放入RabbitMq,我们正在使用AMQP。它总是第一次工作,但第二次我们尝试下订单时,我们从rails获得Errno :: ECONNREFUSED错误,直到我们重新启动Sinatra应用程序。

问题是,我可以通过从show_stopper proc中删除{ EventMachine.stop }行来消除此问题。所以它似乎在某种程度上干扰了Sinatra ......

所以我的问题 - 当我不停止事件机器时,我仍然安全地清理amqp连接后?任何人都可以阐明为什么这会破坏Sinatra应用程序或指向一些可能有助于解释这里发生的事情的资源?

# Create a new Order
post '/api/v1/orders/new' do
  p "starting new order"
  log = Logger.new(STDOUT)
  log.level = Logger::DEBUG

  # Adding the orders code here
  data = JSON.parse(params[:data])
  received_order = data["order"]

  Order.create(received_order) 
  log.debug "Received Order: #{received_order}"


  queue_name = "test"
  EventMachine.run do
    connection = AMQP.connect(:host => '127.0.0.1')
    puts "Connected to AMQP broker. Running #{AMQP::VERSION} version of the gem..."

    channel  = AMQP::Channel.new(connection)
    queue    = channel.queue(queue_name, {:durable => true, :exclusive => false, :auto_delete => false})
    exchange = channel.direct("")

    exchange.publish received_order.to_json, :routing_key => queue.name

    show_stopper = Proc.new {
      connection.close { EventMachine.stop }
    }

    EM.add_timer(2, show_stopper)
  end


  status 200
end

0 个答案:

没有答案