我们有一个非常简单的 sinatra 应用程序,它接收来自一个单独的 Rails 应用程序的 POST 请求的传入“订单”。它需要将订单放入 RabbitMq,我们正在使用 AMQP 执行此操作。第一次它总是有效,但第二次尝试下订单时,我们从 rails 收到 Errno::ECONNREFUSED 错误,直到我们重新启动 Sinatra 应用程序。
问题是,我可以通过{ EventMachine.stop }
从 show_stopper proc 中删除该行来解决这个问题。因此,这似乎在某种程度上干扰了 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