Rhino:暂停、保存状态和恢复javascript的能力

Rhino:暂停、保存状态和恢复javascript的能力,javascript,rhino,java-scripting-engine,Javascript,Rhino,Java Scripting Engine,我正在使用Rhino通过Java解释Java脚本。我的用例需要这些javascripts进行(多个)服务调用(RESTful/Webservices/httpget/POST)。其中一些服务调用本质上是异步的(有24小时的SLA) 在这种情况下,我希望能够暂停脚本的执行,序列化状态(将其保存在S3上,将密钥传递给异步服务的有效负载,该服务在回调时返回),并在从服务返回结果时恢复执行 我面临的挑战是ContinuationPending(扩展RuntimeException)不可序列化(因为上下文

我正在使用Rhino通过Java解释Java脚本。我的用例需要这些javascripts进行(多个)服务调用(RESTful/Webservices/httpget/POST)。其中一些服务调用本质上是异步的(有24小时的SLA)

在这种情况下,我希望能够暂停脚本的执行,序列化状态(将其保存在S3上,将密钥传递给异步服务的有效负载,该服务在回调时返回),并在从服务返回结果时恢复执行

我面临的挑战是ContinuationPending(扩展RuntimeException)不可序列化(因为上下文不可序列化)

问题:是否有其他方法来存储脚本的状态并从其序列化形式中获取它

Javascript:

function invokeFooService(arg) {
    return foo.bar.Helper.invokeFooServiceAsync(arg);
}

function main() {
    // Main JS function
    ..
    var response = invokeFooService(arg);
    if (..) {
        ..
    }
}
function invokeFooService(arg) {
    return foo.bar.Helper.invokeFooServiceAsync(arg);
}

function main() {
    // Main JS function
    ..
    var response = invokeFooService(arg);
    if (..) {
        ..
    }
}
爪哇:


我终于找到了解决办法。关键是使用ScriptableOutputStream(序列化)和ScriptableInputStream(反序列化)继续和作用域

下面是工作代码

Javascript:

function invokeFooService(arg) {
    return foo.bar.Helper.invokeFooServiceAsync(arg);
}

function main() {
    // Main JS function
    ..
    var response = invokeFooService(arg);
    if (..) {
        ..
    }
}
function invokeFooService(arg) {
    return foo.bar.Helper.invokeFooServiceAsync(arg);
}

function main() {
    // Main JS function
    ..
    var response = invokeFooService(arg);
    if (..) {
        ..
    }
}
爪哇: