Ruby AMQP под Тонкий HTTP-сервер - PullRequest
       5

Ruby AMQP под Тонкий HTTP-сервер

0 голосов
/ 27 октября 2011

Я использую простой тонкий сервер, который публикует некоторые сообщения в разные очереди, код выглядит так:

require "rubygems"
require "thin"
require "amqp"
require 'msgpack'

app = Proc.new do |env|

 params  = Rack::Request.new(env).params

 command = params['command'].strip rescue "no command"
 number  = params['number'].strip  rescue "no number"

 p command
 p number

AMQP.start do
  if command =~ /\A(create|c|r|register)\z/i
    MQ.queue("create").publish(number)
  elsif m = (/\A(Answer|a)\s?(\d+|\d+-\d+)\z/i.match(command))
    MQ.queue("answers").publish({:number => number,:answer => "answer" }.to_msgpack )
  end
end

 [200, {'Content-Type' => "text/plain"} , command ]

end

Rack::Handler::Thin.run(app, :Port => 4001)

Теперь, когда я запускаю сервер и делаю что-то вроде http://0.0.0.0:4001/command=r&number=123123123 Я всегда получаю дубликаты, что-то вроде:

"нет команды" "нет номера" "нет команды" "нет номера"

Первое, почему я получаю дубликаты запросов? это как-то связано с браузером? поскольку, когда я использую curl, у меня не такое поведение, и во-вторых, почему я не могу получить параметры?

Любые советы о лучшей реализации для такого сервера будут высоко оценены

Заранее спасибо.

1 Ответ

0 голосов
/ 27 октября 2011

Второй запрос поступает от браузера, ищущего favicon.ico. Вы можете проверить запросы, добавив следующий код в ваш обработчик:

 params  = Rack::Request.new(env).params
 p env # add this line to see the request in your console window

В качестве альтернативы вы можете использовать Синатра :

require "rubygems"
require "amqp"
require "msgpack"
require "sinatra"

get '/:command/:number' do
    command = params['command'].strip rescue "no command"
    number  = params['number'].strip  rescue "no number"
    p command
    p number
    AMQP.start do
        if command =~ /\A(create|c|r|register)\z/i
            MQ.queue("create").publish(number)
        elsif m = (/\A(Answer|a)\s?(\d+|\d+-\d+)\z/i.match(command))
            MQ.queue("answers").publish({:number => number,:answer => "answer" }.to_msgpack )
        nd
    end
    return command
end

и затем запустите ruby the_server.rb в командной строке, чтобы запустить http-сервер.

...