Ruby on rails 如何使用EventMachine在ruby中测试异步HTTP请求
我得到一个RabbitMQ队列的消息,每条消息都是我想要向其发出请求的URL。现在我使用AMQP gem订阅队列,队列使用EventMachine,因此我使用em http请求库发出http请求。根据此处的文档: 以下内容将发出异步http请求:Ruby on rails 如何使用EventMachine在ruby中测试异步HTTP请求,ruby-on-rails,asynchronous,rabbitmq,eventmachine,em-http-request,Ruby On Rails,Asynchronous,Rabbitmq,Eventmachine,Em Http Request,我得到一个RabbitMQ队列的消息,每条消息都是我想要向其发出请求的URL。现在我使用AMQP gem订阅队列,队列使用EventMachine,因此我使用em http请求库发出http请求。根据此处的文档: 以下内容将发出异步http请求: EventMachine.run { http1 = EventMachine::HttpRequest.new('http://google.com/').get http2 = EventMachine::HttpRequest.n
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请求文档中描述的方式。但是,有没有一种方法可以测试请求是否实际上是异步发出的呢?是否可以在每次启动get请求时都写入控制台,这样我就可以看到它们一个接一个地被启动,而无需等待响应?一个非常简单的示例,正好演示了您想要的:
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
输出(对于我):
根据您的internet连接、Heroku和Google,对第二个HTTP请求的响应可能会排在第一位,您可以确定,请求确实是并行完成的。一个非常简单的示例,正好演示了您想要的:
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
输出(对于我):
根据您的internet连接、Heroku和Google,对第二个HTTP请求的响应可能会排在第一位,您可以确定,请求确实是并行完成的。您可以尝试运行tcpdump并分析输出。如果您看到两个连接的TCP三方握手是交错的,那么这些连接是并行发生的
不过,如果这正是您的目标,那么这不可能真正成为自动化测试的一部分。我很乐意验证库是否只执行了它所说的一次,而不是将其作为测试套件的一部分。您可以尝试运行tcpdump并分析输出。如果您看到两个连接的TCP三方握手是交错的,那么这些连接是并行发生的 不过,如果这正是您的目标,那么这不可能真正成为自动化测试的一部分。我很乐意验证库是否只做了它所说的一次,而不是将其作为测试套件的一部分