Verwenden Sie Groovyshell als „Expressions -Evaluator/-motor“ (oder wie man Groovyshell wiederverwendet)

StackOverflow https://stackoverflow.com/questions/5323114

  •  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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top