Errno::EBADF:使用ruby net/http的文件描述符不正确
在进行HTTP连接时,什么会导致返回EBADF(错误的文件描述符)。 下面是我创建HTTP连接的代码。虽然现在错误非常少(发生得非常少),但在我将这些错误用于救援之前,我需要了解EBADF的原因Errno::EBADF:使用ruby net/http的文件描述符不正确,ruby,net-http,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) r
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 }
}
你找到解决办法了吗?我也面临同样的问题。