我现在一直在努力解决 ActiveResource 的问题:当主机名解析 ActiveResource 请求,但另一端没有服务器返回信息时,ActiveResource 的超时值不起作用。请求只是挂起。
在查看 ActiveResource 代码后,我意识到这是因为底层 Net:Http 对象只设置了一个超时值:read_timeout。 Net:Http 库将其定义为“读取一个块(通过一次 read(2) 调用)所需的秒数”。 Net:Http lib还定义了另一个超时值open_timeout,它被定义为“连接打开之前等待的秒数”。
我不确定为什么 open_timeout 没有默认设置为 ActiveResource 类上设置的超时值,但在修改 ActiveResource::Connection 类以在 http 对象上包含 open_timeout 后,我的问题得到了解决!
我是 Rails 新手,所以我不确定在我的项目中实际进行此修改的最佳方法;我不想只更改 gem 目录中的代码。有没有正确的方法在 Rails 项目中进行这些修改?我已经看到可以从 /vendor 文件夹加载 Rails 类,但是它们都必须在那里才能工作吗?我开始创建 ActiveResource::Base 和 ActiveResource::Connection 类的子类,但似乎可能有一种更简单的方法来做到这一点,因为创建 Net:Http 实例的函数是私有的......有什么想法吗?
首先,您应该向 Rails 的 bugtracker 报告这个问题:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/
当我必须修复此类小问题时,我通常会在 RAILS_ROOT/config/initializers 中创建一个初始化程序文件,然后重新打开我打算修复的类。
class ActiveResource::Base
# your fix goes here
end
这称为猴子修补,并且存在一定争议。但我个人认为在继承层次结构中引入一个对我的代码没有语义意义的新级别是相当残酷的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)