Errno :: EBADF:带有ruby net / http的错误文件描述符

时间:2018-03-14 13:56:26

标签: ruby net-http

在建立HTTP连接时返回 EBADF(错误的文件描述符)会导致什么。

以下是我的以下代码,其中建立了HTTP连接。虽然现在错误很少(发生得非常少)但是在我将这些错误用于救援之前我需要了解 EBADF

的原因是什么
def make_http_request(url, headers={})
  uri = URI(url)
  Net::HTTP.start(uri.host, uri.port) do |http|
    req = Net::HTTP::Get.new(uri, headers)
    resp = http.request(req)
    if resp.code.to_i != 200
      logger.error "Retrieve #{resp.code} with #{url} and #{headers}"
      return false
    end
    return resp.body
  end
rescue SocketError, Net::ReadTimeout, Errno::ECONNREFUSED => e
  logger.error "make_http_request #{url} with #{headers} resulted in #{e.message} \n #{e.backtrace}"
  return false
end

我感觉connect syscall正在接收一个在给定时间点无效的FD。但仍无法理解如何发生这种情况。

如果它有助于在使用多个线程的应用程序中使用代码。

简而言之,上述方法的定义如下所示......

module Eval
  def make_http_request(url, headers={})
    ...
    ...
    ..
  end

  def request_local_endpoint(url, headers)
     response = make_http_request(url, headers)
     response && response.fetch('bravo',nil)
  end

  def request_external_endpoint(url, headers)
    response = make_http_request(url, headers)
    response && response.fetch('token',nil)
  end
end

class RequestBuilder
  include Eval
  attr_reader :data
  def initialize(data)
    @data = data
  end

  def start
    token = request_external_endpoint('http://external.com/endpoint1',{'Content-Type'.freeze => 'application/json', 'Authorization' => 'abcdef'})
    return unless token

    result = request_local_endpoint('http://internal.com/endpoint1',{'Content-Type'.freeze => 'application/json'})
    return result
  end
end

10.times { 
   Thread.new { RequestBuilder.new('sample data').start }
}

0 个答案:

没有答案