JMeter Script Engine, позволяющий кэшировать и компилировать
У Jamp223 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.
Я что-то не так проверяю? Нужно ли импортировать больше банок, чтобы включить его? Как я могу узнать, использует ли скриптовый движок кэширование и компиляцию? утверждение JMeter является неправильным / устаревшим?
1 ответ
Вам нужно получить 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.");
}