7
votes

Arrêter le moteur de rhinocéros au milieu de l'exécution

Le moteur de rhinocéros a-t-il une API qui peut arrêter l'exécution d'un script fie au milieu. Par exemple, j'ai un fichier de script dans lequel Il y a une boucle infinte. Comment puis-je arrêter l'exécution au milieu?

Bien sûr, je peux arrêter le JVM qui a commencé le moteur rhinocéros à excacez le script. Mais je ne veux pas tuer toute la session JVM pour cette raison, car j'ai commencé le script de manière programmatique et le moteur Rhino fonctionnant également dans le même JVM que mon application.


0 commentaires

4 Réponses :


-2
votes

Le moteur rhinocéros n'apparaît pas d'avoir un mécanisme pour le faire (mauvais rhinocéros!) Et il est difficile de dire si cela crée des threads en interne, la seule solution que vous avez est de créer un threadgroup , chargez et exécutez Le moteur de rhinocéros et son script de l'intérieur d'un fil dans ce groupe et lorsque vous voulez le tuer, utilisez threadgroup.stop () . Oui, c'est obsolète mais il n'y a vraiment pas d'autre moyen de le faire étant donné qu'il n'y a pas de coopération de la part de la bibliothèque de rhinocéros.


2 commentaires

@ Donal: Cela pourrait probablement ne pas fonctionner, car une fois que je crée un nouveau thread et commencez à charger et à exécuter le moteur de rhinocéros à partir de celui une fois que la méthode EvaluateAder () sur le contexte est appelée l'exécution du thread complète et le moteur Rhino gère l'exécution.


C'est pourquoi j'ai suggéré de le mettre dans son propre groupe de fil; Toute autre threads créée par Rhino sera toujours dans ce groupe de fil (ou un groupe de fil d'enfants) afin qu'il soit toujours possible de les tuer tous .



7
votes

Arrêter l'exécution de JavaScript en cours d'exécution peut être effectué à l'aide de la voie suivante.

1) Créez un débogueur mannequin et en l'attachant au contexte créé initialement.

mcontext = contexte.enter ();
ObservingDeBugger ObservingDeBugger = Nouveau ObservingDebugger ();
mcontext.setdebugger (ObservingDebugger, nouveau entier (0));
mcontext.setgeneratingdebug (vrai);
mcontext.setoptimizationLevel (-1); p>

Le code ObservingDeBugger ressemble comme suit. p>

observingDebugger.setDisconnected(true);


0 commentaires

4
votes

Pour quiconque cherche une solution, le Javadoc pour les détails contextuelfactory Comment arrêter un script fonctionnant plus de 10 secondes:

https://github.com/ Mozilla / Rhino / Blob / Master / Src / Org / Mozilla / JavaScript / ContextFactory.java


3 commentaires

L'approche contextuelle personnalisée fonctionne brillamment. Si vous avez des problèmes de lecture de Javadoc de la Java, il y a une version HTML ici: Jarvana.com/jarvana/view/org/mozilla/rhino/1.7r3/...


Je m'interroge sur l'impact de la performance de cette méthode et la méthode du débogueur. Des idées?


J'imagine que la méthode du débogueur ait un impact sur la performance depuis le contexte générant des informations de débogage. La solution contextuelle incendie simplement une fois qu'un certain nombre d'instructions ont été exécutées.



0
votes

i Exécutez des scripts dans un nouveau fil à l'aide d'un service exécutant et d'expiration future.get xxx pré>

Notez que cette approche n'arrête pas le fil exécutant le script! Pour ce faire, comme l'exécution du fil d'exécution de votre script sera informé pour être interrompu, vous pouvez créer un contexte contextuel personnalisé qui surveille périodiquement cette situation: p> xxx pré>

avant de créer un contexte Objet, vous devez configurer votre application pour utiliser ce contextFactory comme paramètre par défaut, il suffit d'invoquer p> xxx pré>

à l'intérieur de la méthode d'appel de votre appelable, vous pouvez capturer l'erreur: p>

    try {
        cx.setOptimizationLevel(9);
        cx.setInstructionObserverThreshold(10000);
        ScriptableObject scope = cx.initStandardObjects();

        // your code here

    } catch (Error e) {
        System.out.println("execution was aborted: " + e.getMessage());
    } finally {
        Context.exit();
    }


0 commentaires