2011-10-27 7 views
0

の下で、私は別のキューにいくつかのメッセージを公開している、シンプルなシンサーバーを実行している、コードは次のようになります。今、私は、サーバーを実行して、http://0.0.0.0:4001/command=r&number=123123123ような何かを行うときルビーAMQPシンHTTPサーバ

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) 

私はいつも、何かの重複出力を取得しています:

「コマンドなし」 「いいえ番号」 「コマンドなし」 「いいえ番号」

最初に目をなぜ私は二重の要求のようになっているのですか?ブラウザと何か関係がありますか?私がカールを使用するとき、私は同じ振る舞いをしていないので、なぜ私はパラメータを得ることができないのですか?そのようなサーバの最適な実装について

任意のヒントは非常に事前に

おかげでいただければ幸いです。

答えて

0

2番目のリクエストは、favicon.icoを探しているブラウザからのものです。あなたのハンドラに次のコードを追加することにより、要求を検査することができます

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

また、あなたがSinatraを使用することができます。その後、

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 

とhttpサーバを開始するには、コマンドラインでruby the_server.rbを実行します。

+0

迅速な対応をありがとうございます。あなたは正しいようですが、この行動を排除する方法はありますか? AMQPを使ったThinの使用例があります。これは、p envの出力と同様に最適な最適化方法です。https://gist.github.com/78208470bfffbef400fe – eki

+0

異なるWebサーバー上でWebアプリケーションを実行するための抽象レイヤー/ミドルウェアであり、「thin」はラックアプリケーションを実行する実際のWebサーバーです。あなたは "ラックamqp"のためにグーグルグーグルで成功するかもしれません。また、Bunnyのような上位レベルのAMQP宝石の1つ、https://github.com/ruby-amqp/bunnyをご覧ください。希望が役立ちます。 – Matt