如何查找/检索 Rails 中配置的 Rack::Timeout 超时值?

How can I lookup / retrieve the Rack::Timeout timeout value that has been configured in Rails?

在我们的 Rails 应用程序中,我们使用 rack-timeout 0.4.2 并在 config/initializers/timeout.rb 中配置它用于生产和暂存,如下所示:

if Rails.env.production? || Rails.env.staging?
  Rack::Timeout.timeout = (ENV['RACKTIMEOUT'] || 25).to_i # seconds
end

当我们在不久的将来升级 gem 时,这些值可能会设置为 service_timoutwait_timeout

我想检索此值在应用程序中设置的值,以用作任何 MySidekiqWorker.perform_in(CURRENT_TIMEOUT_VALUE, ...) 调用的默认值,而不是只在需要的地方写入 (ENV['RACKTIMEOUT'] || 25).to_i。我在这里尝试解决的问题是 this sidekiq issue,因为它尚未提交,所以它找不到模型。现在不能将这些调用重构为 after_commit 挂钩。

这次尝试给出了以下结果:

0> Rack::Timeout.timeout
=> private method `timeout' called for Rack::Timeout:Class

Rails.app.configuration只有 Rails.app.configuration.middleware.includes? Rack::Timeout as true 并且没有给出我能看到的任何值。

我猜你说的是 https://github.com/sharpstone/rack-timeout

0.4.2 允许使用一些 backwards-compatible methods:

读取值
Rack::Timeout.service_timeout
=> 25

这似乎是处理问题的错误方法。您正在根据环境变量在 Rails 中设置值,因此只需确保它已在 ENV:

中定义
# config/initializers/timeout.rb
if Rails.env.production? || Rails.env.staging?
  ENV['RACKTIMEOUT'] ||= '25'
  Rack::Timeout.timeout = ENV['RACKTIMEOUT'].to_i
end

然后您可以从任何地方阅读它:

MySidekiqWorker.perform_in(ENV['RACKTIMEOUT'].to_i, ...)

可能最好使用 figaro 之类的东西将 ENV 的逻辑分解成单独的配置,以使其更易于管理。

如果您决定升级到更新版本的 gem,那会让您的生活变得更轻松一些。我建议研究它,因为 0.4.2 现在已经有 4 年的历史了。 0.6.0 是最新版本和 gem configures itself using some default environment variables 所以你所要做的就是设置 ENV['RACK_TIMEOUT_SERVICE_TIMEOUT'] 然后你可以完全跳过初始化程序。