我正在接收RabbitMQ队列的消息,每条消息都是我想向其发出请求的一个网址。现在,我使用AMQP订阅队列,该队列使用EventMachine,因此我使用em- http -request库发出http请求。根据这里的文档:https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests将发出异步http请求:
EventMachine.run {
http1 = EventMachine::HttpRequest.new('http://google.com/').get
http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get
http1.callback { }
http2.callback { }
end因此,当我订阅RabbitMQ队列时,我有以下代码:
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文档中描述的方式。但是,有没有一种方法可以测试请求是否实际上是异步发出的呢?是否可以在每次get请求被触发时都写入控制台,这样我就可以看到它们一个接一个地被触发,而不等待响应?
发布于 2013-03-01 06:15:26
您可以尝试运行tcpdump并分析输出。如果您看到两个连接的TCP三次握手是交错的,则说明连接是并行发生的。
但是,如果这是您要尝试的目标,那么这不可能真正成为自动化测试的一部分。我很乐意验证这个库只做了一次它所说的事情,而不是使它成为测试套件的一部分。
发布于 2013-02-24 20:48:14
一个非常简单的例子,确切地演示了你想要什么:
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和Google,对第二个HTTP请求的响应可能会首先出现,你可以肯定,这些请求确实是并行完成的。
https://stackoverflow.com/questions/14974724
复制相似问题