estoy usando GroovyShell
como una "expresión evaluador/motor" dentro de mi programa. Acepta dos entradas: (a) uno o más scripts de inicio (b) scripts definidos por el usuario. Ambos se concatenan en el tiempo de ejecución como una gran porción de script (texto) y se alimentan al shell.GroovyShell como "evaluador de expresiones/motor" (o: Cómo reutilizar GroovyShell)
String initScripts = getFromDB()
String userScript = getFromUser()
def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)
El código anterior se ejecutará en un bucle, donde el contenido de userScript
variarán.
Hasta ahora, initScripts
sólo contienen definiciones de variables (por ejemplo def $yyyy = new Date().format('yyyy')
) que podría hacer referencia en userScript
(por ejemplo print "$yyyy 001"
).
¿Hay alguna enfoque más eficiente para esto? (Por ejemplo, reutilizando el caparazón, ¿cómo?) Porque ahora es muy lento.
Editar: Groovy es una necesidad. Por favor, no recomiende otro motor de scripting.
Editar: Estoy pensando si GroovyShell puede hacer esto (pseudo-código):
def shell = new GroovyShell()
shell.evaluate(initScripts)
for each userScript in DB {
shell.put(userScript)
def result = shell.evaluateThat()
println "Result is $result"
}
Es esto posible? (La última vez que busqué en Google no es posible, pero espero que me equivoque)
¿GroovyShell es sin estado y es seguro para subprocesos? Algunas personas pueden usar el programa al mismo tiempo con diferentes secuencias de comandos (eso es seguro, ya que 'userScript' puede ser diferente por usuario, incluso por invocación). – wiradikusuma
Sí, es seguro para subprocesos y sin estado (pero, como veo, no crea copias defensivas si no utiliza el constructor predeterminado, no debería ser un problema en su caso) http://svn.codehaus.org/groovy/ tronco/groovy/groovy-core/src/main/groovy/lang/GroovyShell.java – Adam
Creo que puedes reutilizar el objeto shell, pero no creo que puedas reutilizar el objeto script. Las instancias de script utilizan un 'Map' para el enlace, que no es seguro para subprocesos. – HDave