【问题标题】:How to test for asynchronous HTTP requests in ruby using EventMachine如何使用 EventMachine 在 ruby​​ 中测试异步 HTTP 请求
【发布时间】:2013-02-20 07:47:07
【问题描述】:

我正在获取 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 请求时写入控制台,以便我可以看到它们一个接一个地被触发而不等待响应?

【问题讨论】:

    标签: ruby-on-rails asynchronous rabbitmq eventmachine em-http-request


    【解决方案1】:

    您可以尝试运行 tcpdump 并分析输出。如果您看到交错的两个连接的 TCP 三向握手,则说明这些连接是并行发生的。

    不过,如果这是您想要达到的目标,那么这实际上不能成为自动化测试的一部分。我很乐意验证该库是否按照它所说的做了一次,而不是让它成为测试套件的一部分。

    【讨论】:

      【解决方案2】:

      一个非常简单的例子,准确地展示了你想要什么:

      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 请求,您可以肯定,这些请求确实是并行完成的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多