Direkte Ausführung mit dem Rhino-API

Ohne Umwege

Roger Butenuth


ArtikelserieTeil 1: JavaScript per Scripting-API auf dem Server ausführenTeil 2: Direkte Einbindung der Rhino Engine

Im ersten Teil habe ich gezeigt, wie einfach über das in JSR 223 definierte API JavaScript aus Java-Programmen heraus ausgeführt werden kann. Dazu gehören auch der Datenaustausch zwischen den beiden Welten und Aufrufe von Funktionen/Methoden in beiden Richtungen.

Hinter dem JSR 223 [1], dessen Implementierung zum standardisierten Sprachumfang von Java gehört, steckt in Oracles JVM eine abgespeckte Version von Rhino [2]. Oracle (oder war es damals noch Sun?) hat dabei die Packages von org.mozilla nach sun.org.mozilla umbenannt. Neben der immer noch klar zu erkennenden Herkunft ergeben sich daraus einige Konsequenzen: Erst einmal sollte klar sein, dass man in seinem Anwendungscode nie direkt Klassen aus dem sun.* Namensraum einbindet, solcher Code funktioniert mit großer Wahrscheinlichkeit nicht auf Java-Implementierungen anderer Hersteller. Wie wir im ersten Teil gesehen haben, ist dies aber auch in den meisten Fällen nicht notwendig. Der JSR 223 bietet von sich aus schon eine leicht zu nutzende Schnittstelle. Außerdem unterstützt die Schnittstelle auch weitere Sprachen. Eine (nicht unbedingt vollständige) Liste der unterstützten Sprachen findet man unter [3]. Die geänderten Package-Namen eröffnen die Möglichkeit, parallel zu der abgespeckten Implementierung der JVM das originale js.jar von Mozilla in den Klassenpfad aufzunehmen. Nutzt man die dort liegenden Klassen, erhält man sowohl Zugriff auf die durch den JSR 223 verdeckten Features als auch auf die Features, die aus Platz- und Kompatibilitätsgründen in der abgespeckten Version nicht vorhanden sind.

Start mit Rhino, wie geht’s?

Nun aber zur Praxis: Wie ruft man mit Rhino ein Skript auf? Eine Factory für mehrere Sprachen entfällt, Rhino spricht nur JavaScript. Gestartet wird mit einem statischen Methodenaufruf Context.enter(), der beim ersten Aufruf im Thread einen neuen Context erzeugt oder bei wiederholten Aufrufen (aus demselben Thread) einen Referenzzähler erhöht. Passend dazu benötigt man Aufrufe von Context.exit(), sonst bleibt Müll im Speicher liegen. Aus dem Context heraus kann man sich jetzt ein Scriptable erzeugen, das nicht nur die Oberklasse für alle in Java implementierten JavaScript-Objekte darstellt, sondern auch einen Variablen-Scope verwaltet. (Beim JSR 223 heißt das Gegenstück Binding.)

Damit hat man alle Zutaten zusammen und kann das Skript mit evaluateString(…) oder eva...

Direkte Ausführung mit dem Rhino-API

Ohne Umwege

Roger Butenuth


ArtikelserieTeil 1: JavaScript per Scripting-API auf dem Server ausführenTeil 2: Direkte Einbindung der Rhino Engine

Im ersten Teil habe ich gezeigt, wie einfach über das in JSR 223 definierte API JavaScript aus Java-Programmen heraus ausgeführt werden kann. Dazu gehören auch der Datenaustausch zwischen den beiden Welten und Aufrufe von Funktionen/Methoden in beiden Richtungen.

Hinter dem JSR 223 [1], dessen Implementierung zum standardisierten Sprachumfang von Java gehört, steckt in Oracles JVM eine abgespeckte Version von Rhino [2]. Oracle (oder war es damals noch Sun?) hat dabei die Packages von org.mozilla nach sun.org.mozilla umbenannt. Neben der immer noch klar zu erkennenden Herkunft ergeben sich daraus einige Konsequenzen: Erst einmal sollte klar sein, dass man in seinem Anwendungscode nie direkt Klassen aus dem sun.* Namensraum einbindet, solcher Code funktioniert mit großer Wahrscheinlichkeit nicht auf Java-Implementierungen anderer Hersteller. Wie wir im ersten Teil gesehen haben, ist dies aber auch in den meisten Fällen nicht notwendig. Der JSR 223 bietet von sich aus schon eine leicht zu nutzende Schnittstelle. Außerdem unterstützt die Schnittstelle auch weitere Sprachen. Eine (nicht unbedingt vollständige) Liste der unterstützten Sprachen findet man unter [3]. Die geänderten Package-Namen eröffnen die Möglichkeit, parallel zu der abgespeckten Implementierung der JVM das originale js.jar von Mozilla in den Klassenpfad aufzunehmen. Nutzt man die dort liegenden Klassen, erhält man sowohl Zugriff auf die durch den JSR 223 verdeckten Features als auch auf die Features, die aus Platz- und Kompatibilitätsgründen in der abgespeckten Version nicht vorhanden sind.

Start mit Rhino, wie geht’s?

Nun aber zur Praxis: Wie ruft man mit Rhino ein Skript auf? Eine Factory für mehrere Sprachen entfällt, Rhino spricht nur JavaScript. Gestartet wird mit einem statischen Methodenaufruf Context.enter(), der beim ersten Aufruf im Thread einen neuen Context erzeugt oder bei wiederholten Aufrufen (aus demselben Thread) einen Referenzzähler erhöht. Passend dazu benötigt man Aufrufe von Context.exit(), sonst bleibt Müll im Speicher liegen. Aus dem Context heraus kann man sich jetzt ein Scriptable erzeugen, das nicht nur die Oberklasse für alle in Java implementierten JavaScript-Objekte darstellt, sondern auch einen Variablen-Scope verwaltet. (Beim JSR 223 heißt das Gegenstück Binding.)

Damit hat man alle Zutaten zusammen und kann das Skript mit evaluateString(…) oder eva...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang