我正在收到 RabbitMQ 队列的消息,每条消息都是我要向其发出请求的 URL。现在我使用 AMQP gem 订阅队列并使用 EventMachine,所以我使用 em-http-request 库来发出 http 请求。根据此处的文档:https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests 以下将发出异步 http-requests:
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 请求时写入控制台,以便我可以看到它们一个接一个地被触发而不等待响应?