【发布时间】:2012-01-26 20:10:19
【问题描述】:
我正在使用 JDK 的 javax.script.* 包。具体来说,我使用的是 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's discretion...
// upon reaching this comment, we know now that Java has told JavaScript that it's okay to resume, so the next line will now be executed...
print("world");
}
如果“暂停”/“中断”部分涉及绑定 Java 函数并将其传递给当前 ScriptEngine 或其他任何内容的引用,那对我来说很酷。我认为这可能涉及到:在 Java 中暂停 JavaScript。
我做了一些谷歌搜索,发现这里的关键字似乎是“延续”。据我所知,Rhino 只支持解释模式(相对于编译模式)的延续,我看到这是通过将“上下文”设置为 -2 来实现的。由于内置的 JDK ScriptEngine 似乎没有提到任何关于上下文的内容(或者我可能错过了它),这是否意味着我必须直接下载和使用 Mozilla 的 Rhino 库?
我需要 Rhino continuations 来完成这个任务吗?我在 Rhino continuations 上找到了a useful tutorial,但是在阅读完之后,我不能 100% 确定这是否能够完成我上面描述的内容。如果这是我正在寻找的,那么我的后续问题是关于提到的“序列化”:这是否意味着当我恢复我的脚本时,除非我序列化,否则所有变量都将被取消设置他们?
更新:看起来这在 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,但现在,它什么也没做。我的下一个目标是充实其代码,以便将延续和脚本信息存储为 Java 对象,以便 Java 以后可以恢复脚本。
现在,它正在做的是在打印“Hello”之后但在打印“world”之前暂停/“破坏”脚本,所以这向我证明可以通过这种方式暂停脚本。
所以,在这一点上,我应该弄清楚的是如何继续继续。请注意,以上默认情况下使用JDK脚本引擎工作(此时我不需要担心解释模式与编译模式 - 它似乎默认为解释模式),但它看起来像恢复脚本的过程将需要 Mozilla 的 Rhino 库。
【问题讨论】:
标签: java javascript scripting rhino