JRuby on Rails: const_missing появляется с момента включения config.threadsafe - PullRequest
1 голос
/ 02 апреля 2012

Я вижу, что возникает исключение, которое не происходит, когда config.threadsafe! отключено в моем приложении JRuby on Rails. Это имеет тенденцию всплывать при перезапуске tomcat6, но это может произойти и после запуска приложения. Я вижу много ошибок, таких как:

uninitialized constant Foo::Check
org/jruby/RubyModule.java:2590:in `const_missing'

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

1 Ответ

1 голос
/ 02 апреля 2012

Основная проблема заключается в том, что require не является потокобезопасным действием в ruby.Одним из аспектов этого является то, что определение класса не происходит атомарно.

Обратите внимание на следующее в файле foo.rb

class Foo
  BAR=1
  def bar
  end
end

Поток 1 указывает Foo::BAR где-нибудь в вашем приложении и начинает загрузку foo.rb.Доходит до class Foo, создавая класс Foo, но не дальше.Затем поток 1 прерывается, а поток 2 также обращается к Foo::BAR.Foo уже определен, поэтому foo.rb не загружается снова, однако BAR еще не определен (это будет, когда поток 1 завершит свою работу), и вы получите сообщение об отсутствии const.Точно так же объект Foo, созданный в этой точке, не будет иметь метода bar в течение короткой доли секунды.

Очевидно, что чем больше класс, тем больше это окно(чтобы было легче увидеть, вы можете вставить вызов в режим ожидания частично через определение класса)

Чтобы обойти это, rails загружает весь код вашего приложения при запуске приложения, но если у вас есть код в нестандартные места это не получит это лечение.Вы можете контролировать то, что загружается таким образом, с помощью параметра config.eager_load_paths.

...