Я использую пакет javax.script. * JDK. В частности, я использую механизм JavaScript, который, из того, что я читал, похоже, основан на разработанном Mozilla JavaScript-in-Java-интерпретаторе Rhino.
То, что я намереваюсь выполнить, состоит в том, чтобы в моем режиме JavaScript мог "приостановить" себя в определенный момент кода (скажем, наполовину через вызов функции) и только возобновить себя позже, когда Java разрешит это сделать.
Чтобы проиллюстрировать, что я имею в виду, представьте этот код JavaScript:
function myJSFunction() {
print("Hello ");
mysteriousPauseFunction(); // this is the part I'm wondering about. basically, the script should break here and resume later at Java discretion...
// upon reaching this comment, we know now that Java has told JavaScript that it okay to resume, so the next line will now be executed...
print("world");
}
Если "пауза" / "ломающаяся" часть включает привязку функции Java и передачу ее ссылки на текущий ScriptEngine или что-то еще, что круто со мной. Я думаю, что это, вероятно, будет включать: приостановку JavaScript из Java.
Я сделал несколько поисковых запросов и обнаружил, что ключевое слово здесь выглядит как "продолжения". Из того, что я могу сказать, Rhino поддерживает только продолжения в интерпретируемом режиме (в сравнении с скомпилированным режимом), который, как я вижу, достигается путем установки "контекста" на -2. Поскольку встроенный JDK ScriptEngine, похоже, не упоминает ничего о контекстах (или, может быть, мне его не хватает), значит ли это, что я должен загружать и использовать библиотеку Mozilla Rhino напрямую?
И есть ли продолжения носорогов, что мне нужно для этого? Я нашел полезный учебник о продолжениях Rhino, но, прочитав его, я не уверен на 100%, если это будет возможно чтобы выполнить то, что я описал выше. Если это то, что я ищу, тогда мой следующий вопрос касается упоминания о "сериализации": означает ли это, что, когда я возобновляю свой script, все переменные будут отменены, если я не сериализую их?
Обновление: Похоже, это возможно с Rhino. Вот то, что у меня есть до сих пор в моем JavaScript; после кода я объясню, что он делает...
var end = new Continuation();
function myJSFunction()
{
print("Hello ");
var kont = new Continuation();
storePause(script, kont); // script is previously bound by Java into the JavaScript. it is a reference to the script itself.
end();
print("world");
}
Моя функция "storePause()" - это функция Java, которую я написал, и она привязана к JavaScript, но прямо сейчас она ничего не делает. Следующей моей целью будет сформировать его код таким образом, чтобы он сохранял продолжение и script информацию как объекты Java, так что Java может возобновить script позже.
В настоящий момент то, что он делает, приостанавливает/ "ломает" script после "Hello", но перед печатью "мир", это доказывает мне, что можно приостановить script таким образом.
Итак, все, что я должен был оставить, чтобы понять на этом этапе, - это возобновление продолжения. Обратите внимание, что вышеописанное работает с использованием механизма сценариев JDK по умолчанию (мне не нужно беспокоиться о интерпретируемом режиме и скомпилированном режиме на данный момент - он по умолчанию используется для интерпретируемого режима), но он выглядит как процесс возобновления a script потребуется библиотека Mozilla Rhino.