Rails 5 останавливает пользовательское промежуточное ПО http во время перезагрузки. - PullRequest
0 голосов
/ 27 июня 2018

В режиме разработки 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 голосов
/ 27 июня 2018

Если ваше пользовательское промежуточное ПО отправляет запрос обратно к работающему приложению Rack, вам будет очень легко не повезти. Но это можно заставить работать.


К тому времени, когда ваш начальный запрос находится внутри Reloader, фактическая перезагрузка уже произошла - но это только unload .

После выгрузки любые классы приложений (или движков) необходимо будет снова автоматически загрузить при следующем обращении к ним ... и я думаю, что именно здесь вы столкнулись с проблемой: внутренний запрос должен что-то загрузить , но это не может быть сделано, пока внешний запрос активен.

Чтобы исправить это, внешний запрос должен сообщить системе, что он находится в безопасном месте для другого потока / запроса на загрузку нового кода. В частности, вам нужно обернуть запрос Net::HTTP (только - , а не @app.call(env)) с permit_concurrent_loads.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...