1、脚本引擎
① 通过脚本名称获取:ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
pasting
- ScriptEngineManager manager = new ScriptEngineManager();
- ScriptEngine engine = manager.getEngineByName("JavaScript");
2、方法调用
Java虚拟机支持脚本的意义在于实现函数式的编程,即脚本中最重要的便是方法。一些脚本引擎允许使用者单独调用脚本中的某个方法,支持此操作的脚本引擎可以通过实现javax.script.Invocable接口,支持顶层方法或者某对象中成员方法的调用。使用方法调用时最好先检查脚本引擎是否实现了Invocable接口,JavaSE中的JavaScript引擎已实现了Invocable接口。
① 在Java中调用脚本中的顶层方法
3、示例代码
Reader scriptReader = null ;
try {
String configFileRootDir = System.getProperty("configFileRootDir") ;
if(StringUtils.isNotBlank(configFileRootDir)){
File jsFile = new File(configFileRootDir+File.separator+"collectscript"+File.separator+scriptFileName);
LOGGER.debug("scriptReader jsFile.getAbsolutePath(): "+jsFile.getAbsolutePath());
scriptReader = new InputStreamReader(new FileInputStream(jsFile)) ;
}else{
scriptReader = new InputStreamReader(JavaScriptJMXUtil.class.getClassLoader().getResourceAsStream("collectscript/" + scriptFileName));
}
ScriptEngineManager manager = new ScriptEngineManager() ;
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(scriptReader) ;
if(engine instanceof Invocable){
Invocable invEngine = (Invocable)engine ;
Map<String,Object> resultMap = (HashMap)invEngine.invokeFunction("collectEntranceFunction",kpiArray,jmx_hostname,jmx_port,jmx_username,jmx_pwd,mBeanUri);
}
return resultMap ;
}
被调用的 test.js 文件
var logger = org.slf4j.LoggerFactory.getLogger("jmx_activemq_kpitemp.js");
var util = new com.ai.toptea.jmx.monitor.javascript.platform.CassandraPlatformUtil(); //java 类实现公共方法
function collectEntranceFunction(kpiArray,jmx_hostname,jmx_port,jmx_username,jmx_pwd) {
logger.info("execute jmx_activemq_kpitemp.js...");
var msc = util.initMBeanServerConnAndReturn(jmx_hostname,jmx_port,jmx_username,jmx_pwd);
var resultMap = new java.util.HashMap();
for(var i=0 ; i<kpiArray.length ; i++ ){
resultMap.put(kpiArray[i],this[kpiArray[i]](msc));
}
util.closeJMXConnector();//关闭JMXConnector连接
logger.info("execute jmx_activemq_kpitemp.js completed.");
return resultMap;
}