重新加载重载器时,Rails 5停止了自定义的http中间件。

时间:2018-06-26 22:16:13

标签: ruby-on-rails ruby-on-rails-5

在Rails 5开发模式下,我在自定义会话中间件中不断遇到此Net::ReadTimeout(Net::ReadTimeout)错误,该中间件向本地模拟自定义会话引擎发出了HTTP请求。同样,只有在我更改了代码并且Rails渲染错误页面后才触发错误。这非常烦人,并且确实减慢了开发过程,因为我们所有人都必须刷新两次才能看到代码更改的结果。

在这些中间件中查找代码之后,看来我的自定义会话中间件在重新加载程序完成重新加载之前启动了http请求。

我想知道我们是否可以停止/停止机架中间件请求,使其不再下降,直到重新加载完成。

Rails版本:5.1

Ruby版本:2.4.1

在重新加载器完成加载之前和之后,我放置了以下日志消息

application.rb

ActiveSupport::Reloader.to_run do
  puts 'Reloading'
end

ActiveSupport::Reloader.to_complete do
  puts 'DONE Reloading'
end

custom_session_siddleware.rb

def call(env)
  ...
  puts 'Session Processing'
  http = Net::HTTP.new(uri, port)
  ...
  @app.call(env)
end

更改代码并刷新后的输出

Reloading
Session Processing
DONE Reloading

这是我所有的中间件

use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use RequestStore::Middleware
use ActionDispatch::RemoteIp
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use MyCustomSession::CustomSessionMiddleware

1 个答案:

答案 0 :(得分:0)

如果您的自定义中间件正在向正在运行的Rack应用程序发出请求,那么很容易遇到麻烦。但是可以使它起作用。


当您的初始请求进入Reloader时,实际的重装已经发生了-但这只是 unload

在卸载之后,所有应用程序(或引擎)类都需要在下次访问它们时再次自动加载...而我认为这就是您遇到的问题:内部请求需要加载某些内容,但是在外部请求处于活动状态时无法这样做。

要解决此问题,外部请求需要通知系统它在安全的位置,以便另一个线程/请求加载新代码。具体来说,您需要使用permit_concurrent_loads包装Net::HTTP请求(仅- @app.call(env))。