1

我一直在努力解决 ActiveResource 的问题:当主机名解析 ActiveResource 请求,但另一端没有服务器返回信息时,ActiveResource 的超时值不起作用。请求只是挂起。

查看 ActiveResource 代码后,我意识到这是因为底层的 Net:Http 对象只设置了一个超时值:read_timeout。Net:Http 库将其定义为“等待读取一个块的秒数(通过一次 read(2) 调用)”。Net:Http 库还定义了另一个超时值 open_timeout,它被定义为“等待连接打开的秒数”。

我不确定为什么默认情况下未使用 ActiveResource 类上设置的超时值设置 open_timeout,但是在修改 ActiveResource::Connection 类以在 http 对象上包含 open_timeout 之后,我的问题得到了解决!

我是 Rails 新手,所以我不确定在我的项目中实际进行此修改的最佳方法;我不想只更改我的 gem 目录中的代码。是否有适当的方法在 Rails 项目中进行这些修改?我已经看到可以从 /vendor 文件夹加载 rails 类,但是它们都必须在那里才能工作吗?我开始创建 ActiveResource::Base 和 ActiveResource::Connection 类的子类,但似乎有更简单的方法可以做到这一点,因为创建 Net:Http 实例的函数是私有的......有什么想法吗?

4

1 回答 1

3

首先,这是您应该向 Rails 的 bugtracker 报告的问题: https ://rails.lighthouseapp.com/projects/8994-ruby-on-rails/

当我必须修复这些小问题时,我通常会在 RAILS_ROOT/config/initializers 中创建一个初始化文件并重新打开我打算修复的类。

class ActiveResource::Base
  # your fix goes here
end

这被称为猴子修补,并且有些争议。但我个人认为在继承层次结构中引入一个对我的代码没有语义意义的新级别是非常残忍的。

于 2009-07-24T09:22:20.570 回答