2016-07-26 20 views
3

Wir möchten Nashorn in einem Servlet verwenden. Die Idee ist, eine Singleton-Instanz von ScriptEngine zu verwenden, die bei jeder Anfrage wiederverwendet wird. Bei jeder Anforderung wird eine neue EngineScope-Bindung erstellt, und die Überprüfung wird mit dieser Bindung ausgeführt. Dann wird die Bindung gelöscht. Es werden keine gemeinsamen Objekte an die Bindungen übergeben (nur die Anfrage-/Antwortobjekte vom Servlet).Nashorn: gleichzeitige Bewertung mit Singleton ScriptEngine? Gewinde sicher?

Innerhalb der Servlets kann die Singleton-Instanz von ScriptEngine gleichzeitig in verschiedenen Threads ausgewertet werden, wird dies ordnungsgemäß funktionieren oder wird es zu einem Threading-Problem kommen? Hier ist ein Code, der die Idee gibt:

Antwort

3

Meine Antwort auf meine eigene Frage: Ich würde kein Singleton wie oben beschrieben verwenden. Trotz einiger potenzieller Threading-Probleme möchten Sie die Bindungen bei jeder Anforderung wahrscheinlich nicht zerstören (da dies das erneute Kompilieren von Skripten erforderlich macht). Am Ende haben wir einen Pool von Engines und die zugehörigen Scope-Bindings erstellt. Ein Motor/Bindungspaar.

Bei jeder Servlet-Anfrage greifen wir ein Engine/Bindungspaar aus dem Pool, setzen die Anfrage/Antwort in die Bindung und führen dann das Skript aus. Es gibt keine Threading-Probleme, über die Sie sich Sorgen machen müssen, da ein bestimmtes Engine/Bindungspaar jeweils nur von einem einzelnen Thread ausgeführt wird. Wenn die Anforderung abgeschlossen ist, wird das Engine/Bindung-Paar an den Pool zurückgegeben. Scheint gut zu funktionieren.

+0

Ich frage mich nur, ob Sie ein bisschen mehr Details über Ihre Einrichtung geben könnten. Wir hatten ähnliche Nebenläufigkeitsprobleme mit Nashorn in einer Webanwendung (serverseitiges Rendering mit React). Wir haben versucht, die Engine in einem ThreadLocal einzubinden, aber die Leistung war sehr schlecht. Wir experimentieren jetzt mit CompiledScript und Invocable. Wie groß ist Ihr Pool? Ich nehme an, wenn Sie keine Anfragen erhalten, die der Thread-Pool-Größe entsprechen, werden Sie Probleme bekommen ... – mryan

+0

Ich entschied mich für einen Pool von Nashorn-Engines. Mein erster Versuch war, einfach einen Pool von Engines zu haben und jedesmal neue Bindings neu zu erstellen (aber das schien jedes Mal, wenn das Script aufgerufen wird, das erneute Kompilieren der Nashorn-Skripte zu erzwingen. Also habe ich ein Wrapper-Objekt erstellt Die Skripte werden nicht jedes Mal neu kompiliert, wenn das Servlet das gleiche Skript aufruft.Wenn das Servlet beendet ist, wird das Wrapper-Objekt an den Pool zurückgegeben – adamM

+0

Ein Reaper-Thread wird so oft aufgerufen die Leistung ist gut genug. Etwas langsamer als ein normales Servlet, aber gut. Es gibt eine Menge kleiner Details darüber, wie man die Skripte aus der Datei lädt, ohne sie neu zu kompilieren. Ich denke über Open Source nach , was denkst du? – adamM