1 import java.io.*;
2 import javax.script.Invocable;
3 import javax.script.ScriptEngine;
4 import javax.script.ScriptEngineManager;
5 import javax.script.ScriptException;
6 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory;
8 import com.ppcredit.common.util.file.FileUtil;
9
10 /**
11 * 公共的JS脚本引擎工具类
12 */
13 public class CommonScriptEngineUtil {
14 private static Logger log = LoggerFactory.getLogger(CommonScriptEngineUtil.class); // 日志
15
16 private static ScriptEngine engine = (new ScriptEngineManager()).getEngineByName("javascript");
17
18 private static Invocable invoke = null;
19
20 /**
21 * 调用js中的函数
22 * @param jsName js文件名称
23 * @param functionName 调用的函数名称
24 * @param param 调用js函数的参数
25 * @return
26 */
27 public static String invokeJSFuntion(String jsName, String functionName, String param){
28 initJS(jsName);
29 synchronized (invoke) {
30 String result = param;
31 if(invoke != null){
32 try {
33 long startTime = System.currentTimeMillis();
34 String c = (String)invoke.invokeFunction(functionName, param);
35 long endTime = System.currentTimeMillis();
36 log.info("invokeJSFuntion 耗时 >>>>" + (endTime-startTime));
37 result = c;
38 } catch (NoSuchMethodException e) {
39 log.error(e.getMessage());
40 } catch (ScriptException e) {
41 //如果出错就重新加载
42 initJS(jsName);
43 log.error(e.getMessage());
44 }
45 }
46 return result;
47 }
48 }
49
50
51 private static void initJS(String jsName){
52 String basePath = FileUtil.getAppPath(CommonScriptEngineUtil.class);
53 String jsFileName = basePath + "/resources/" + jsName; // 读取js文件
54 InputStreamReader reader = null;
55 try {
56 reader =new InputStreamReader(new FileInputStream(jsFileName),"UTF-8");
57 engine.eval(reader);
58 if(engine instanceof Invocable) {
59 invoke = (Invocable)engine;
60 }
61 } catch (FileNotFoundException e) {
62 log.error(e.getMessage());
63 } catch (ScriptException e) {
64 log.error(e.getMessage());
65 } catch (UnsupportedEncodingException e) {
66 log.error(e.getMessage());
67 } finally {
68 if(reader != null){
69 try {
70 reader.close();
71 } catch (IOException e) {
72 log.error(e.getMessage());
73 }
74 }
75 }
76 }
77
78 public static void main(String[] args){
79 String enc = invokeJSFuntion("aes.js","valAesEncryptSet","123456");
80 System.out.println(enc);
81 }
82 }