2012-04-02 7 views
1

Ich sehe eine Ausnahme schleichen, die nicht passiert, wenn config.threadsafe! auf meiner JRuby on Rails-Anwendung deaktiviert ist. Das schleicht sich beim Neustart von tomcat6 auf, kann aber auch nach dem Start der Anwendung passieren. Ich bin eine Menge Fehler wie die folgenden zu sehen:JRuby auf Rails: const_missing zeigt seit dem Aktivieren von config.threadsafe

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

Meine Anwendung läuft weiterhin gut funktionieren und dient Anforderungen ohne Probleme. Ich bin nur neugierig, was könnte die Ursache für diese neu gefundenen Ausnahmen sein? Ist das ein generisches, bekanntes Problem? Muss ich mehr Code für die verschiedenen Bereiche der App bereitstellen, in denen dieser genaue Fehler zur weiteren Diagnose hinzukommt?

Antwort

1

Das Kernproblem ist, dass require in thread-safe-Aktivität in Ruby nicht erforderlich ist. Ein Aspekt davon ist, dass die Klassendefinition nicht atomar erfolgt.

Betrachten Sie die folgende, in foo.rb

class Foo 
    BAR=1 
    def bar 
    end 
end 

Thread 1 Treffer Foo::BAR irgendwo in Ihrer App und startet Laden foo.rb. Es kommt so weit wie class Foo, Erstellen der Foo-Klasse, aber nicht weiter. Thread 1 wird dann gesperrt und Thread 2 trifft auch auf Foo::BAR. Foo ist bereits definiert, also wird foo.rb nicht erneut geladen, BAR ist jedoch noch nicht definiert (es wird sein, wenn Thread 1 fertiggestellt ist) und du erhältst einen const fehlenden Fehler. Auf die gleiche Weise würde ein Foo Objekt, das an diesem Punkt erstellt wurde, keine bar Methode für einen kurzen Bruchteil einer Sekunde haben. Offensichtlich

, desto größer eine Klasse ist, desto größer ist dieses Fenster (um es leichter zu sehen, können Sie einen Anruf halten teilweise durch die Klassendefinition schlafen)

Um dies zu umgehen, Schienen lädt alle Ihres Anwendungscodes beim Start der Anwendung, aber wenn Sie Code in nicht standardmäßigen Standorten haben, wird diese Behandlung nicht ausgeführt. Über die Einstellung config.eager_load_paths können Sie steuern, was geladen wird.

Verwandte Themen