Verwenden Sie Groovyshell als „Expressions -Evaluator/-motor“ (oder wie man Groovyshell wiederverwendet)
-
24-10-2019 - |
Frage
Ich benutze GroovyShell
als "Ausdrucksbewerter/Engine" in meinem Programm. Es akzeptiert zwei Eingaben: (a) ein oder mehrere Init-Skripte (b) benutzerdefiniertes Skript. Beide werden dann zur Laufzeit als großer Teil des Skripts (Text) und der Shell verkettet.
String initScripts = getFromDB()
String userScript = getFromUser()
def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)
Der obige Code wird in einer Schleife ausgeführt, wo der Inhalt von userScript
wird variieren.
Bis jetzt, initScripts
enthalten nur variable Definitionen (z. B. z. B. def $yyyy = new Date().format('yyyy')
) auf die in Bezug auf userScript
(z.B print "$yyyy 001"
).
Gibt es dafür einen effizienteren Ansatz? (ZB der Wiederverwendung der Hülle, wie?) Weil es gerade ist sehr langsam.
Bearbeiten: Groovy ist ein Muss. Bitte empfehlen Sie keinen anderen Skriptmotor.
Bearbeiten: Ich denke, ob Groovyshell dies kann (Pseudo-Code):
def shell = new GroovyShell()
shell.evaluate(initScripts)
for each userScript in DB {
shell.put(userScript )
def result = shell.evaluateThat()
println "Result is $result"
}
Ist das möglich? (Das letzte Mal, als ich gegoogelt habe, ist es nicht möglich, aber ich hoffe, dass ich falsch liege)
Lösung
Sie können die Groovyshell zwischenspeichern, Sie müssen nicht immer einen neuen erstellen:
final static GroovyShell shell = new GroovyShell()
Auch wenn Sie ein Skript oft ausführen, können Sie sie auch zwischenspeichern. Sie können a erstellen Script
mit Groovyshell.Parse (String scriptText), verwenden Script.run () das Skript ausführen.
Diese Abteilung Von der Dokumentation könnte auch hilfreich sein, anstatt Skripte können Sie auch dynamisch groovige Objekte erstellen.
Andere Tipps
Ich denke, Sie könnten jedes Mal das Gewicht des Aufbaus einer vollen groovigen Umgebung vermeiden.
Seit Java 6 gibt es in Java eine API -Unterstützung von Scripting, mit der Sie leichte Skriptmotoren verwenden können.
Als Beispiel siehe Diese Seite in Groovy -Website Erklären Sie, wie Sie ein grooviges Skript in einer Java -Anwendung beginnen GroovyScriptEngineImpl
.
Beachten Sie, dass Sie einige groovige Güte verlieren, wie vielleicht groovige Traube, aber Sie können es in der Lage sein
- Verwenden Sie Ihre Skript -Engine wieder
- Stellen Sie sicher, dass Ihre Skript -Evals im Anwendungskontext (schließlich von der Verwendung von Java -Objekten profitieren).
BEARBEITEN Eine wichtige Sache zu bemerken ist, dass keines auch nicht GroovyScriptEngineImpl
Noch GroovyShell
Kann Ihnen jede Art von Thread -Sicherheit garantieren, da jedes groovige Skript eine beliebige Anzahl von Threads hervorbringt. In der Tat könnten Sie nur die Sicherheit der Faden garantieren, die durch Installieren eines SecurityManager Verbot von Threadoperationen. Tatsächlich würde dies nicht garantieren, dass die Sicherheit der Threads garantiert wird (da diese Thread -Sicherheit nur erreicht werden konnte, indem sichergestellt wird, dass alle Ihre Java -Codebasis sicher sind).
Am Ende mache ich das:
def shell = new GroovyShell()
shell.evaluate(initScripts)
for( i in 1..count )
{
output = shell.evaluate(userScripts);
}
Und nur um sicher zu sein, können Sie setzen shell
in ThreadLocal
oder Pool.