Uso il GroovyShell
come "motore di valutazione espressioni" all'interno del mio programma. Accetta due input: (a) uno o più script di init (b) script definito dall'utente. Entrambi vengono quindi concatenati in fase di esecuzione come una grande porzione di script (testo) e vengono inviati alla shell.Utilizzo di GroovyShell come "motore di valutazione espressioni" (o: Come riutilizzare GroovyShell)
String initScripts = getFromDB()
String userScript = getFromUser()
def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)
Il codice precedente verrà eseguito in un ciclo, dove il contenuto di userScript
varieranno.
Finora, initScripts
contengono solo definizioni di variabili (ad esempio def $yyyy = new Date().format('yyyy')
) che potrebbe essere fatto riferimento nel userScript
(ad esempio print "$yyyy 001"
).
Esiste un approccio più efficiente per questo? (Ad esempio, riutilizzando il guscio, come?) Perché adesso è molto lento.
Modifica: Groovy è un must. Si prega di non raccomandare altri motori di scripting.
Edit: Sto pensando se GroovyShell può fare questo (pseudo-codice):
def shell = new GroovyShell()
shell.evaluate(initScripts)
for each userScript in DB {
shell.put(userScript)
def result = shell.evaluateThat()
println "Result is $result"
}
è possibile? (L'ultima volta che ho cercato su Google non è possibile, ma spero di sbagliarmi)
GroovyShell è stateless e thread safe? Alcune persone possono utilizzare il programma contemporaneamente con script diversi (questo è certo, poiché 'userScript' potrebbe essere diverso per utente, anche per invocazione). – wiradikusuma
Sì, è sicuro per i thread e stateless (ma come vedo io non crea copie difensive se non utilizza il costruttore predefinito - non dovrebbe essere un problema nel tuo caso) http://svn.codehaus.org/groovy/ tronco/groovy/groovy-core/src/main/groovy/lang/GroovyShell.java – Adam
Penso che si possa riutilizzare l'oggetto shell, ma non penso che sia possibile riutilizzare l'oggetto script. Le istanze di script usano un 'Map' per l'associazione, che non è thread-safe. – HDave