问题标签 [jsr223]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2175 浏览

java - Nashorn ScriptEngine 使用多少内存?

我们目前正在为我们的一款产品添加服务器端脚本功能。作为其中的一部分,我正在评估 JSR 223 脚本引擎。由于我们可能会在服务器上运行大量脚本,因此我特别关心这些脚本引擎的内存使用情况。将 Rhino(Apple JDK 1.6.0_65-b14-462-11M4609,Mac OS X 10.9.2)与 Nashorn(Oracle JDK 1.8.0-b132)进行比较,每个 ScriptEngine 实例的内存使用量似乎存在巨大差异。

为了测试这一点,我使用了一个简单的程序来启动 10 个空白 ScriptEngine 实例,然后阻止从标准输入读取。然后我使用 jmap 进行堆转储(jmap -dump:format=b,file=heap.bin),然后在转储中搜索相关的脚本引擎实例:

取消上下文中各种读取器/写入器字段的原因是因为我们不使用它们,并且早期的 Rhino 堆转储表明它们构成了每个实例开销的很大一部分(并且似乎没有共享) .

在 Eclipse MAT 中分析这些堆转储,然后我得到以下每个实例保留的堆大小:

  • Rhino:13,472 字节/实例(如果我不将读取器/写入器字段清空,则上升到 73,832 字节/实例)
  • Nashorn:324,408 字节/实例

Nashorn 的规模会增加 24 倍吗?执行速度不是我们将要执行的脚本(主要是 I/O 绑定)的主要关注点,因此我正在考虑发布我们自己的 Rhino 副本以在 Java 8+ 中使用。

0 投票
1 回答
1446 浏览

java - 在评估脚本后读取更新的变量

我正在测试一些与 Rhino 一起使用的 JSR 223(脚本)代码,以了解它如何与 Nashorn 一起使用。一个不同的领域是处理通过Bindings参数传入的变量的更新engine.eval()。在 Rhino 中,我可以在评估脚本时使用此方法传入动态变量绑定,然后在执行脚本后读取这些变量的任何更新值。然而,在 Nashorn 中,这不起作用 - Bindings 对象中的所有变量的值在执行脚本后仍然以其初始值存在。

用一个 TestNG 测试用例来说明:

使用 Rhino(Mac OS X 10.9.3 上的 Apple JDK 1.6.0_65)测试通过。使用 Nashorn (Oracle JDK 1.8.0_b132) 它失败了。我尝试了各种不同的方法来读取变量之后 - 调用engine.get(),engine.getBindings(ScriptContext.ENGINE_SCOPE).get()engine.getContext().getBindings(...).get()。结果总是null.

如果我调用它然后用 之后读取它,我可以让它工作,但与仅将绑定作为参数传递相比,这似乎有点混乱。engine.put("state", 1)engine.get("state")

阅读 JSR-223 规范,我找不到任何支持这种用法的措辞,那么它是特定于引擎的吗?还有其他方法可以在 Nashorn 中完成我想要的吗?

编辑:一种可行的方法是将每个变量包装在 an 中AtomicReference,然后.set(..)在 Javascript 中调用显式方法。丑陋,但可能可行。

0 投票
4 回答
16414 浏览

groovy - 在 JMeter 中增加用户定义的变量

我有一个注册 REST 服务来测试性能。对于每个循环/线程请求,只需更改必需的参数 mobilenumber

作为负载测试的一部分,如何在线程/循环到多个测试时增加我的用户定义变量(通过增量值存储为另一个 udv)。

尝试为所有成功的注册请求使用 jsr 233 预处理器

我不想使用 csv,因为我只有一个要更改的参数

我正在阅读有关 var.get() 和 vars.put() 可以使用但没有正确理解的函数。


尝试以下代码 - 代码下方显示的登录

日志 :

根据日志,增量成功但 vars.put() 不成功?

0 投票
1 回答
346 浏览

scala - Scala JSR 223 导入类型/类

以下示例失败,因为Stuff找不到 的定义:

我找不到任何允许我在语句中使用自己的类的导入eval语句。难道我做错了什么?如何在 期间使用一个导入类eval

编辑:澄清示例代码以引出更直接的答案。

0 投票
0 回答
442 浏览

java - JSR 223 ScriptEngine、Invocable、Compilable/CompiledScript——它们相互补充吗?

我可能需要一些解释我还没有找到答案的东西 - 无论是在此处还是在 javadoc 或规范中......(至少到目前为止)

我正在构建一个必须在 JSR 223 的帮助下执行 Javascript 代码的应用程序。我通过几个 JS 对象与 JS 世界进行交互,这些对象可以通过全局变量获得。这就是为什么我主要使用Invocable.invokeMetho来调用 JS 的原因。(我通过Invocable.invokeFunction调用 JS 构造函数来创建这些对象,并使用ScriptEngine.put()将返回的对象设置在 JS var 中。我使用ScriptEngine.eval()读取的实际代码)

现在这是一个服务器应用程序,因此 CPU 占用和执行速度很重要。所以我发现了Compilable。这让我想到了我的第一个问题:为什么这个接口存在?为什么不同的脚本引擎不在内部透明地执行此操作?

好的,但回到我必须使用Compilable的假设。而不是使用ScriptEngine.eval阅读我的 JS 源代码,我会使用Compilable.compile()。这会返回一个CompiledScript给我。它有一个只提供eval方法的接口。但不是任何类似于Invocable API 的东西。

那么如何从CompiledScript回到Invocable呢?我仍然想使用它,API 给了我一个很好的抽象!:-)

任何人都可以帮我解决这个问题吗?(这一切都发生在带有 Rhino 的 Java 7 上。当然,迁移到 Java 8 - 即 Nashorn - 即将到来,所以我将不得不处理这两个引擎。)

非常感谢,托本

更新:好的,现在我发现我忽略了规范中的一些部分,关于 Invocable 和 Compilable 的部分。所以看起来我在使用 Invocable 时已经获得了编译的好处(为什么他们没有在 javadoc 中提到这一点?!)。

但是我还有一个问题:如何导入我的源代码?如果我使用ScriptEngine.eval导入它, Invocable会对我的代码进行准编译吗?

0 投票
2 回答
10846 浏览

performance - JSR223 后处理器在 jmeter 中解析 json

我使用 BSF 后处理器在我的一个 jmeter 测试文件中解析 json。我的代码如下。

但我发现 BSF 后处理器会降低 Jmeter 的性能。所以我要使用 JSR223 后处理器。我需要知道上面 JSR223(JAVA 语言)中对应的代码是什么。提前致谢;

0 投票
1 回答
437 浏览

java - 如何在 Jmeter 中使用现有的 Java API 测试

我们有现有的 Java 测试来单独测试我们的后端。这些测试非常精细,并且也作为单个用户运行。我想知道我是否可以简单地采用这些现有的测试/类/库/jar 等,然后将 JMeter 包裹在它们周围,以便从命令行(即 Maven)将它们作为 JMeter 测试执行。

可能会添加一些侦听器和其他 JMeter 组件,但测试的方式是完美的,只是它们不是多线程的并且没有 JMeter 具有的报告功能。

这可以使用 JSR233 完成吗?

如果我的图书馆位于其他地方怎么办?如何在 JMeter 项目中使用它们?

0 投票
0 回答
1970 浏览

groovy - JMeter 中的 Groovy 脚本:当包含使用 GString 插值的闭包时,错误“期望除 ''\n'' 之外的任何内容;无论如何都得到了@line ...”

我有这个 groovy 脚本,它定义了一个正常工作的闭包。

但是当我向脚本添加另一个使用 GString 插值的闭包时。

我得到错误

即使添加的闭包被评论。

还是失败!是什么赋予了?

0 投票
1 回答
442 浏览

java - Scala 脚本引擎创建另一个单例实例

所以,我正在JSR 223为 Scala 创建一个脚本系统,但我遇到了这个问题,我找不到任何原因。

有一个类似单例的类,它具有添加事件侦听器(来自脚本)和调度事件(来自核心)的方法。一切正常,但由于某种原因,当我要调度事件时,添加的侦听器消失了。

重现问题后,我发现脚本引擎创建了另一个单例实例:

这是我的Singleton课:

这是我的Main课:

这是输出:

堆栈跟踪显示脚本引擎最终创建了 的新实例Singleton,但我不知道为什么。

谢谢你。

0 投票
4 回答
18684 浏览

java - Should I use a separate ScriptEngine and CompiledScript instances per each thread?

My program uses Java Scripting API and can eval some scripts concurrently. They don't use shared script objects, Bindings or Context, but can use same ScriptEngine and CompiledScript objects. I see that Oracle Nashorn implementation in Java 8 is not multithreaded, ScriptEngineFactory.getParameter('THREADING') returns null about which the documentation says:

The engine implementation is not thread safe, and cannot be used to execute scripts concurrently on multiple threads.

Does it mean that I should create a separate instance of ScriptEngine for each thread? Besides, documentation says nothing about CompiledScript concurrent usage but:

Each CompiledScript is associated with a ScriptEngine

It can be assumed that CompiledScript thread-safety depends on related ScriptEngine, i.e. I should use separate CompiledScript instance for each thread with Nashorn.

If I should, what is the appropriate solution for this (I think very common) case, using ThreadLocal, a pool or something else?