0

別のRailsアプリから発信されたPOSTリクエストから受信した「注文」を受け取る非常に単純なsinatraアプリがあります。注文をRabbitMqにドロップする必要がありますが、これはAMQPで行っています. 最初は常に機能しますが、2 回目に注文しようとすると、Sinatra アプリを再起動するまでレールから Errno::ECONNREFUSED エラーが発生します。

{ EventMachine.stop }問題は、show_stopper プロシージャから行を削除することで、この問題を解決できるということです。つまり、何らかの形でシナトラに干渉しているように見えます...

私の質問 - イベント マシンを停止しない場合でも、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
4

0 に答える 0