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;
}