1

我收到RabbitMQ隊列的消息,並且每條消息都是我想要發出請求的URL。現在我使用AMQP gem來訂閱隊列並使用EventMachine,所以我使用em-http-request庫來創建http請求。根據該文件在這裏:當我訂閱的RabbitMQ隊列我有以下代碼如何使用EventMachine在ruby中測試異步HTTP請求

EventMachine.run { 
    http1 = EventMachine::HttpRequest.new('http://google.com/').get 
    http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get 
    http1.callback { } 
    http2.callback { } 
end 

所以:https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests 下會發出異步HTTP的請求

x = 0 
EventMachine.run do 
    connection = AMQP.connect(:host => '127.0.0.1') 
    channel = AMQP::Channel.new(connection) 
    channel.prefetch(50) 
    queue = channel.queue("http.requests") 
    exchange = channel.direct("") 

    queue.subscribe do |metadata, payload| 
     url = payload.inspect 
     eval " 
     @http#{x} = EventMachine::HttpRequest.new(url).get 
     @http#{x}.callback do 
      puts \"got a response\" 
      puts @http#{x}.response 
     end 
     x = x+1 
     " 
    end 
end 

這種動態創建新變量並創建新的http請求,類​​似於em-http-request文檔中描述的方式。但有沒有辦法來測試這些請求是否實際上是異步進行的?每次發出獲取請求時,是否可以寫入控制檯,以便我可以看到它們一個接一個地被觸發,而不等待響應?

回答

0

一個很簡單的例子,恰恰證明你想要什麼:

require 'em-http-request' 

EM.run do 
    # http://catnap.herokuapp.com/3 delays the HTTP response by 3 seconds. 
    http1 = EventMachine::HttpRequest.new('http://catnap.herokuapp.com/3').get 
    http1.callback { puts 'callback 1' } 
    http1 
    puts 'fired 1' 

    http2 = EventMachine::HttpRequest.new('https://www.google.com/').get 
    http2.callback { puts 'callback 2' } 
    puts 'fired 2' 
end 

輸出(對我來說):

fired 1 
fired 2 
callback 2 
callback 1 

取決於你的互聯網連接,Heroku的和谷歌,響應於第二上HTTP請求可能會首先進入,您可以確定,請求確實是並行完成的。

1

您可以嘗試運行tcpdump並分析輸出。如果您看到兩個交叉連接的TCP三路握手正在交織,那麼連接就會並行發生。

雖然這不是真正的自動化測試的一部分,但如果這就是您要實現的目標。我很樂意驗證圖書館是否做了它曾經說過的事情,而不是讓它成爲測試套件的一部分。