2008-12-12 5 views
1

Je suis en train d'implémenter un programme qui utilise Groovy comme un moteur de script offrant aux utilisateurs la possibilité d'automatiser des tâches. D'où les scripts doivent être chargés à la demande, que je réalise avec le code suivant:Groovy: le meilleur moyen de charger des scripts dynamiques

// short version, try/catch and error handling skipped 
String[] roots = new String[] { "data" }; 
Binding binding = new Binding(); 
GroovyScriptEngine gse = new GroovyScriptEngine(roots); 

binding.setVariable("control", this.getControl()); 
// .. several others 

gse.run(scriptName, binding); // where scriptName is provided through user selection 

J'ai remarqué que l'exécution prend entre 400 et 800 millisecondes pour le bloc entier sur la course de poing, mais descend 200 à 400 sur des courses plus tard sur mon cahier. Au début, un nouveau GroovyScriptEngine a été initialisé pour chaque événement et terminé après. En attendant, j'utilise une instance GSE pour l'ensemble du programme, bien que la question initiale soit encore ouverte:

Existe-t-il un moyen de précompiler les scripts groovy, c'est-à-dire au démarrage du GSE? groovyc n'est pas une option car cela nécessiterait un appel de programme "externe".

Merci beaucoup!

Répondre

2

Je regarde le même problème et ont les éléments suivants:

  • Créer un seul EGE qui ressemble à un répertoire partagé (« data » dans votre exemple)
  • Les moniteurs individuels EGE et pré compile les éléments dans le répertoire de sorte que soit le haut de la vitesse (pas sûr, mais l'EGE semble avoir des choses staitc qui pend autour entre la création d'instance.

Si vos scripts ne changent pas beaucoup, puis les pré-compilation est la meilleure façon d'aller et quand un changement est enregistré re-co mpile à ce moment-là.

Espérons que ça aide.

+0

Je ne pouvais pas trouver un moyen de précompiler les scripts groovy sauf groovyc, mais le GroovyScriptEngine ne sélectionne pas le bon script s'il est seulement disponible en tant que * .class (du moins pas avec le code décrit dans la question initiale) . Y a-t-il un autre moyen d'atteindre la même chose? – MrG

Questions connexes