JMeter脚本引擎,允许缓存和编译
问题内容:
JSR223
Sampler
声明Groovy实现的Compilable interface
语言不同于其他脚本语言,因此建议使用
为了从缓存和编译中受益,用于脚本编写的语言引擎必须实现JSR223
Compilable接口(Groovy是其中之一,而Java,beanshell和javascript不是)
我尝试使用JSR223
Sampler中的类似代码对其进行检查。我尝试使用Compilable检查所有可用的语言:
import javax.script.Compilable;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
ScriptEngineManager mgr = new ScriptEngineManager();
engineFactories = mgr.getEngineFactories();
for (ScriptEngineFactory engineFactory : engineFactories) {
if (engineFactory instanceof Compilable) {
log.info(engineFactory.getEngineName() + " Script compilation is supported.");
} else {
log.info(engineFactory.getEngineName() + " Script compilation is not supported.");
}
}
我的结果是:
Oracle Nashorn Script compilation is not supported.
JEXL Engine Script compilation is not supported.
Groovy Scripting Engine Script compilation is not supported.
JEXL Engine Script compilation is not supported.
Velocity Script compilation is not supported.
BeanShell Engine Script compilation is not supported.
表示 不 支持编译,
编辑1 我根据@aristotll更改检查,现在返回 所有 支持编译
final ScriptEngine engine = engineFactory.getScriptEngine();
if (engine instanceof Compilable) {
编辑2
我根据@aristotll第二次修改
try {
((Compilable) engine).compile("");
log.info(engineFactory.getEngineName() + " Script compilation is supported.");
} catch (Error e) {
log.info(engineFactory.getEngineName() + " Script compilation is not supported.");
我得到的结果很有趣:Nashorn和JEXL支持它
Groovy Scripting Engine Script compilation is supported.
Oracle Nashorn Script compilation is supported.
JEXL Engine Script compilation is supported.
BeanShell Engine Script compilation is not supported.
JEXL Engine Script compilation is supported.
我在检查问题吗?我需要导入更多的jar来启用它吗?我怎么知道脚本引擎是否使用缓存和编译?JMeter的陈述是错误/过时的吗?
问题答案:
您需要获取ScriptEngine
实例而不是ScriptEngineFactory
final ScriptEngine engine = engineFactory.getScriptEngine();
if (engine instanceof Compilable) {
...
为何全部Compilable
?因为这些脚本引擎将来可能会被编译。但目前尚不支持,因此它们都实现了此接口。您可以尝试编译空字符串:
if (engine instanceof Compilable) {
try {
((Compilable) engine).compile("");
} catch (Error e) {
System.out.println(engineName + " Script compilation is not supported.");
} catch (ScriptException e) {
e.printStackTrace();
}
System.out.println(engineName + " Script compilation is supported.");
} else {
System.out.println(engineName + " Script compilation is not supported.");
}