2019独角兽企业重金招聘Python工程师标准>>>

突然想起之前做过的一个小项目,项目虽小,需求却不小,要求解析特定格式的字符串,并且特定格式并非一成不变,想要一套系统能够支持解析多变的规则且更改规则时不能起停服务。

java先天因素决定了他不能支持热加载,所以就着手从其它语言结合使用,于是javascript就被揪出来了,编写容易,与java易集成。下面是对其简单做了封装,使其通用易迁移。

IJSEngine.java 核心接口

package com.voole.p2pauth.util.js.service;import java.util.Map;public interface IJSEngine {String getStringReturn(String jsFile, String functionname);String getStringReturn(String jsFile, String functionname, Object... args);String getStringReturnByRealPath(String jsFile, String functionname);String getStringReturnByRealPath(String jsFile, String functionname, Object... args);Boolean addGlobleJavaObj(Map<String, Object> globleJavaObjMap);
}

JSEngineImpl.java 接口实现

package com.voole.p2pauth.util.js.center;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;import org.apache.log4j.Logger;import com.voole.p2pauth.util.js.service.IJSEngine;public class JSEngineImpl implements IJSEngine {private static final Logger LOGGER = Logger.getLogger(JSEngineImpl.class);private static final ScriptEngineManager manager = new ScriptEngineManager();private static final ScriptEngine engine = manager.getEngineByName("javascript");private Map<String, Object> globleJavaObj = new HashMap<>();private boolean evalJSByClassPathFile(String jsfileName) {try {ClassLoader classLoader = JSEngineImpl.class.getClassLoader();InputStream reader = classLoader.getResourceAsStream("rule/" + jsfileName + ".js");if (null == reader) {return false;}if (null != this.globleJavaObj && this.globleJavaObj.size() > 0) {for (Entry<String, Object> obj : this.globleJavaObj.entrySet()) {engine.put(obj.getKey(), obj.getValue());}}engine.eval(new BufferedReader(new InputStreamReader(reader)));return true;} catch (ScriptException e) {LOGGER.error(e.getMessage(), e);// e.printStackTrace();return false;}}private boolean evalJSByRealPathFile(String jsfileName) {try {if (null != this.globleJavaObj && this.globleJavaObj.size() > 0) {for (Entry<String, Object> obj : this.globleJavaObj.entrySet()) {engine.put(obj.getKey(), obj.getValue());}}engine.eval(new BufferedReader(new FileReader(jsfileName)));return true;} catch (ScriptException | FileNotFoundException e) {LOGGER.error(e.getMessage(), e);// e.printStackTrace();return false;}}@Overridepublic String getStringReturn(String jsFile, String functionname) {if (this.evalJSByClassPathFile(jsFile)) {if (engine instanceof Invocable) {return this.invoke(functionname);}}return null;}@Overridepublic String getStringReturn(String jsFile, String functionname, Object... args) {if (this.evalJSByClassPathFile(jsFile)) {if (engine instanceof Invocable) {return this.invoke(functionname, args);}}return null;}@Overridepublic String getStringReturnByRealPath(String jsFile, String functionname) {if (this.evalJSByRealPathFile(jsFile)) {if (engine instanceof Invocable) {return this.invoke(functionname);}}return null;}@Overridepublic String getStringReturnByRealPath(String jsFile, String functionname, Object... args) {if (this.evalJSByRealPathFile(jsFile)) {if (engine instanceof Invocable) {return this.invoke(functionname, args);}}return null;}private <T> T invoke(String funcname, Object... args) {Invocable invocable = (Invocable) engine;try {return (T) invocable.invokeFunction(funcname, args);} catch (NoSuchMethodException | ScriptException e) {LOGGER.error(e.getMessage(), e);// e.printStackTrace();return null;}}@Overridepublic Boolean addGlobleJavaObj(Map<String, Object> globleJavaObjMap) {this.globleJavaObj = globleJavaObjMap;return true;}}

调用

public static void main(String[] args) {IJSEngine ENGINE = SccUtilFactory.instanceJSEngine();// 设置js全局变量Map<String, Object> globleJavaObj = getGlobleObj();ENGINE.addGlobleJavaObj(globleJavaObj);// 执行js规则解析,并返回解析后的playurlString play_url = ENGINE.getStringReturn(test.jd,……);
}

js文件

function auth_validate_1_0(data){LOGGER.info("data:"+data);var jdata=eval('(' + data + ')');var urlObj=eval('(' + JsUtil.urlToObject(jdata.url) + ')');}

转载于:https://my.oschina.net/shyloveliyi/blog/888168

使用javascript让项目支持热插拔相关推荐

  1. JavaScript面向对象的支持(7)

    ================================================================================ Qomolangma OpenProj ...

  2. github流程图_10月份Github上最热门的JavaScript开源项目

    开源最前线(ID:OpenSourceTop) 猿妹整编 转载请注明来源作者 10 月份 GitHub 上最热门的JavaScript开源项目排行已经出炉啦,在本月的名单中,有开源书籍.有开源课程等, ...

  3. react 开源项目_2020年2月Github上最热门的JavaScript开源项目

    来自:开源最前线(ID:OpenSourceTop)  2月份GitHub上最热门的JavaScript开源项目排行已经出炉啦,一起来看看上榜详情: 1joplin https://github.co ...

  4. GitHub 十大顶级 JavaScript 开源项目

    在本文中,我们将介绍GitHub上顶级的JavaScript开源项目. 作者 | Isha Jauhari 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: ...

  5. JavaScript小项目之BMI值计算

    项目题目: 实现BMI值计算器 项目作用: 复习JavaScript课程知识,学习DOM基础知识,熟悉document对象的使用,实现简单的BMI计算器页面. JavaScript小项目系列 前言 一 ...

  6. 3月份GitHub上最热门的JavaScript开源项目(下)

    开源最前线(ID:OpenSourceTop) 猿妹整编 转载请注明来源作者 3月份GitHub上最热门的JavaScript开源项目新鲜出炉,web界面的JavaScript库Vue强势霸榜,Moz ...

  7. 安卓系统采用v4l2接口打开YUYV和MJPEG摄像头,支持热插拔。

    安卓系统采用v4l2接口打开YUYV和MJPEG摄像头,支持热插拔. 1、需求:安卓5.1系统,视频监控门禁主板(rk3288)上要用到两个摄像头,且两个摄像头要同时打开. 2、背景:开始使用安卓系统 ...

  8. 从 JavaScript 明星项目看前端发展

    目录 2016 2017 2018 2019 2016 虽然 2016 年出现了"JS 疲劳",也发生了戏剧性的事件(如 "leftpad 门"),但总体来讲 ...

  9. Nuxt项目支持import写法的最新解决方案

    Nuxt项目支持import写法的最新解决方案 参考文章: (1)Nuxt项目支持import写法的最新解决方案 (2)https://www.cnblogs.com/sese/p/11976250. ...

最新文章

  1. R语言与数据分析(6)-R包的安装
  2. AI工程师必读的10本ML读物(附PDF下载)
  3. word保存时标题变成黑框(mac版本)
  4. Python源码阅读-内存管理机制(二)
  5. mysql 代理 a_Keepalived+Mysql+Haproxy
  6. 突然讨厌做前端,讨厌代码_不要讨厌HATEOAS
  7. Camera中对焦模式总结
  8. 对于spring的一些巩固一些难点的理解 2021-04-18
  9. AI学习笔记(七)图像滤波器、OpenCV算法解析
  10. ubuntu安装gcc失败怎么办?
  11. 华为OJ编程 动态规划类
  12. 机动目标跟踪——Singer模型
  13. FontForge 修改,删除,设计字体
  14. 知乎视频:联合创作盘活内容价值
  15. 强力推荐mac快速查看应用快捷键工具:键指如飞FlyKey
  16. IVY throws IOException Resetting to invalid mark原因及解决办法
  17. 九校联考-长沙市一中NOIP模拟Day1T3 优美序列(sequence)
  18. 电商数仓(dwd 层)
  19. Scikit-learn学习系列 | 4. sklearn特征降维方法汇总(方差过滤,卡方,F过滤,互信息,嵌入法)
  20. c语言程序设计课程作用,《C语言程序设计》课程标准

热门文章

  1. (转) 地区赛获胜策略,赛前默念!
  2. QTP连接oracle
  3. oracle中创建触发器
  4. WPF框架的内存泄漏BUG
  5. Windows Server2016 安装及配置DFS实现数据复制
  6. saiku执行过程代码跟踪
  7. red5下nginx安装配置
  8. Entity Framework Code First在Oracle下的伪实现
  9. 实战:使用TCP/IP筛选保护服务器安全
  10. Exchange 2010 恢复误删除的邮箱账户及其邮箱