Ruby on rails 如何使用EventMachine在ruby中测试异步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

我得到一个RabbitMQ队列的消息,每条消息都是我想要向其发出请求的URL。现在我使用AMQP gem订阅队列,队列使用EventMachine,因此我使用em http请求库发出http请求。根据此处的文档: 以下内容将发出异步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请求文档中描述的方式。但是,有没有一种方法可以测试请求是否实际上是异步发出的呢?是否可以在每次启动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三方握手是交错的,那么这些连接是并行发生的

不过,如果这正是您的目标,那么这不可能真正成为自动化测试的一部分。我很乐意验证库是否只做了它所说的一次,而不是将其作为测试套件的一部分