我已经安装了rack-timeout gem并在初始化器中创建了rack_timeout.rb。我在rack_timeout.rb中设置了Rack :: Timeout.service_timeout = 1.我想限制rack-timeout以在超时超时时暂停执行在api内的控制器以外的控制器中。只有api控制器'应该停止执行。我在lib中创建了一个名为my_middleware.rb的自定义中间件
class MyMiddleware < Rack::Timeout
def initialize(app, options = {})
@app = app
@exclude = options[:exclude]
end
def call(env)
if env['PATH_INFO'].include? "api"
super(env)
else
@app.call(env)
end
end
end
配置/ development.rb
config.middleware.use "MyMiddleware"
但它没有工作。机架超时时,超时发生超时时抛出异常。
答案 0 :(得分:1)
非常有趣的问题。每次在执行请求时都将其超时,这不是一个很好的做法,但是似乎没有其他现成的解决方案。
我继续进行分叉rack_timeout
,并基于请求路径(略微基于您的代码)添加了过滤。
基本上,它通过Rack::Timeout
类扩展了Select
class Select < Timeout
def call(env)
if exclude_or_any?(env) #checking for parameters passed on init
super(env)
else
@app.call(env)
end
end
...
end
它使用原始的initialize方法并接受2个其他参数:
exclude: ["paths", "to", "exclude"]
-对于来自包含所提供字符串的路径的请求,请勿运行超时。only: ["only_timeout_this"]
-仅处理来自那些路径的请求。我不建议您定期使用它,因为最好将超时保持在您所请求的任何过程中,但是为了开发和简单起见,就足够了。
更多信息可在回购中找到: