如何查找/检索 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_timout
或 wait_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']
然后你可以完全跳过初始化程序。
在我们的 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_timout
或 wait_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']
然后你可以完全跳过初始化程序。