当前位置: 首页 > 编程日记 > 正文

使用javascript让项目支持热插拔

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

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

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

相关文章:

设计模式:状态模式(State Pattern)

作者&#xff1a;Wang Juqiang 创建于&#xff1a;2012-07-16 出处&#xff1a;http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于&#xff1a;2013-03-01 结构图 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 适用性…

拼命学的编程,你却可能错过一个亿!

先来看 2 则新闻&#xff1a;近日 AI 圈最火的新闻当属“AI独角兽依图科技上市”&#xff0c;“AI四小龙”先后开启了上市之路&#xff0c;继旷视科技、云从科技分别谋求港股、A股上市后&#xff0c;依图科技也加入了 IPO 队伍。国内 AI 科技公司的发展&#xff0c;也标志着国家…

web标准的商业价值

web标准的商业价值作者&#xff1a;阿捷 2004-7-3 0:37:26原文来自&#xff1a;adaptivepath.com 作者介绍&#xff1a;Jeffrey Veen是AdaptivePath.com的合伙人之一&#xff0c;专门研究网页设计新技术&#xff0c;你可以在他的个人站点veen.com上学到更多知识。 自从开始we…

OO真经——关于面向对象的哲学体系及科学体系的探讨(上)

http://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html 目录 Catelog 序言 Perface 真经第一章&#xff1a;世界 Waltanschauung 真经第二章&#xff1a;抽象 Abstraction 真经第三章&#xff1a;层次 Arrangement 真经第四章&#xff1a;继承 Inheritance 真经第五…

一次防CC***案例

本文来自 :http://baiying.blog.51cto.com/1068039/1113087 名词解释&#xff1a;摘自百度百科 名称起源 CC Challenge Collapsar&#xff0c;其前身名为Fatboy***&#xff0c;是利用不断对网站发送连接请求致使形成拒绝服务的目的&#xff0c; CC***是DDOS&#xff08;分布…

滴滴联合比亚迪:首款定制网约车D1发布

11月16日&#xff0c;滴滴出行举办“滴滴开放日”&#xff0c;正式发布全球首款定制网约车D1。这款车基于滴滴平台上5.5亿乘客、上千万司机需求、百亿次出行数据&#xff0c;针对网约车出行场景&#xff0c;在车内人机交互、司乘体验、车联网等多方面进行定制化设计。作为第一款…

表格对决CSS--一场生死之战

表格对决CSS--一场生死之战作者&#xff1a;阿捷 2004-7-19 21:00:54原文作者&#xff1a;Sergio Villarreal 作者简介&#xff1a;墨西哥网页设计师&#xff0c;1993年接触网络&#xff0c;个人主页为Overcaffeinated.net 原文出处&#xff1a;sitepoint.com 原文发表时间&…

使用Docker-Docker for Web Developers(2)

1. 使用镜像 1.1 在Docker Hub上查找镜像 我们查找一下之前博客里面&#xff0c;推送到Docker Hub里面的bage88/docker-demo&#xff0c;能看到有2个仓库&#xff0c;第一个就是我们上次上传的镜像。点击“Details”进入到详细页面。 1.2 拉取镜像到本地机器 在我们本地虚拟机上…

赠书 | 图像分类问题建模方案探索实践

作者 | 中国农业银行 陆春晖责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国*文末有赠书福利背景图像分类&#xff0c;是计算机视觉领域的一个核心问题&#xff0c;顾名思义就是输入一张图像&#xff0c;根据内容将其划分到某一个特定的类别。与其他分类问题相比&a…

数据库开发个人总结(ADO.NET小结)

一&#xff0e;用SqlConnection连接SQL Server 1..加入命名空间using System.Data.SqlClient;2.连接数据库SqlConnection myConnection new SqlConnection();myConnection.ConnectionString "user idsa;passwordsinofindb;initial catalogtest;data source127.0.0.1;Con…

PHP 调用C的代码

用php调用C函数&#xff0c;常通过调用系统命令函数的方式来实现&#xff0c;其中主要有system()和exec()两种&#xff0c;还有一种是passthru(),这种方法没有尝试&#xff0c;暂不作讨论。 system()方法输出并返回最后一行的shell结果。 exec()不输出结果&#xff0c;返回最后…

态势“知”多少,点开就知道

2019独角兽企业重金招聘Python工程师标准>>> 态势感知&#xff0c;最核心的是“知” 关于“知” 典故不少 《孙子兵法》六千多字&#xff0c;“知”出现了79次&#xff0c;只有《势篇》与《行军篇》中没有“知”字。 史称两个半完人之一的王阳明 在经过五溺三变的曲…

17 种正则表达式

作者&#xff1a;http://blog.csdn.net/hivak47/archive/2004/10/31/161006.aspx"^/d$" //非负整数&#xff08;正整数 0&#xff09; "^[0-9]*[1-9][0-9]*$" //正整数 "^((-/d)|(0))$" //非正整数&#xff08;负整数 0&#xff09…

程序员如何乘风破浪?从数据库历史看技术人发展 | CSDN 高校俱乐部

2009 年我国数据库软件市场规模为 35.03 亿元&#xff0c;2017 年我国数据库软件市场规模增长至 120.00 亿元。8年时间内&#xff0c;我国数据库软件市场始终保持平稳增长&#xff0c;年均复合增长率为 17.5%&#xff0c;且增速呈现递增趋势。根据中研产业研究院估计&#xff0…

陶哲轩实分析 定理 13.3.5 :紧致度量空间上的连续函数一致连续

设 $(X,d_X)$ 和 $(Y,d_Y)$ 都是度量空间,假定 $(X,d_X)$ 是紧致的,如果 $f:X\to Y$ 是函数,那么 $f$ 是连续的当且仅当 $f$ 是一致连续的.证明:当 $f$ 是一致连续时,$f$ 显然是连续的.我们主要证明 $f$ 连续时一致连续.我们采用反证法,假若 $f$ 不是一致收敛的,意味着无论如何…

SQLServer------插入数据时出现IDENTITY_INSERT错误

详细错误信息&#xff1a; 当 IDENTITY_INSERT 设置为 OFF 时&#xff0c;不能为表 Student 中的标识列插入显式值。 原因&#xff1a; 表中存在某个字段是自动增长的标识符 解决方法&#xff1a; set IDENTITY_INSERT Student ON //设置为OFF时表示不能手动给拥有标识符的列插…

ASP.NET 制作让搜索引擎可以友好访问的链接

作者&#xff1a;http://www.donews.net/lealting/archive/2004/03/31/9759.aspx今天看了一篇文章&#xff0c;主要是讲&#xff0c;如何制作让搜索引擎可以友好访问的链接&#xff0c;大概的内容是这样的&#xff1a;很多的时候我们在进行查询的时候&#xff0c;总是会以这样的…

机器学习中的7种数据偏见

作者 | Hengtee Lim翻译 | Katie&#xff0c;责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国机器学习中的数据偏差是一种错误&#xff0c;其中数据集的某些元素比其他元素具有更大的权重和或表示。有偏见的数据集不能准确地表示模型的用例&#xff0c;从而导致结果…

windows7 下arp 绑定的实现

局域网的arp***常常让人头痛&#xff0c;绑定IP/MAC地址是解决方式之一&#xff1b; 在xp下面绑定mac地址很简单&#xff0c;只需“arp -s IP地址 MAC地址 ”就ok&#xff0c; 在win7下的命令有所不同&#xff1b; 首先&#xff0c;需要查看可用网卡的id&#xff0c;使用命令n…

Asp.net(c#)实现多线程断点续传

http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.html以前一直错误的认为在ASP.NET中无法通过编程方式实现多线程断点续传&#xff0c;今天终于获得了这样一个解决方案&#xff0c;让我明白要学习的东西还很多。此解决方案基于其它解决方案及相关资料&#xff0c;根…

0.7秒完成动漫线稿上色,爱奇艺发布AI上色引擎

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;中国漫画的需求量在不断增加&#xff0c;而动漫制作成本一直居高不下。究其原因为动漫制作是一个复杂且耗时的过程&#xff0c;需要大量工作人员在不同阶段进行协作。动漫制作过程中&#xff0c;需先创作关键帧草图&am…

Java Web整合开发读书笔记

下载JDK&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载Eclipse: http://www.eclipse.org/downloads/ 下载Tomcat: http://tomcat.apache.org/download-70.cgi 正则表达式&#xff1a;http://www.cnblogs.com/deerchao…

ListView中CheckBox使用问题

因为CheckBox的点击事件优先级比ListView的高&#xff0c;所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应。 解决的方法&#xff1a;在CheckBox中加入android:focusable"false"。使得CheckBox初始的时候没有获取焦点。 假设想在单击C…

网页播放的视频代码

网页播放的视频代码 第一种是通过调用window media player进行播放诸如&#xff1a;wmv,asf等格式文件: <object alignmiddle classOBJECT classidCLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 height320 idMediaPlayer width356> <param name"ShowStatusBar…

[Ruby] 模块

1. 命名空间模块定义了一个命名空间&#xff0c;方法和常量可以在其中任意使用而不必担心被其他方法或常量干扰&#xff0c;例如&#xff1a;module Testdef Test.method()end end模块常量的命名和类常量一样&#xff0c;都以大写字母开头&#xff0c;方法定义类似于类方法的定…

10个工程师,9个不合格!

如果你想问最近这些年什么编程语言最值得学习&#xff0c;我会毫不犹豫的告诉你是Python。无论是刚入门的程序员&#xff0c;还是年薪BATJ的技术大牛&#xff0c;都无可否认现在Python对于一个程序员职业发展的重要性。所以不仅是开发小白&#xff0c;甚至很多开发老手&#xf…

云计算(2)it 是什么

2015年&#xff0c;全世界在it上面的花费达到3亿8千亿美金之多。 云数据中心&#xff1a;核心基础架构&#xff0c;云计算的物理载体&#xff0c;提供数据处理、存储和高性能计算支撑&#xff0c;包括服务器、存储、冷却、机房空间和能耗管理等。 超大规模的云数据中心&#xf…

大批量生成假数据,faker.js获得近28k个Star

整理 | 夕颜图源 | 视觉中国来源 | CSDN&#xff08;ID:CSDNnews&#xff09;近日&#xff0c;GitHub上一个生成假数据的项目faker.js火了&#xff0c;攀升Trendinging榜单第二&#xff0c;标星目前已超过27.1k。只需要简单几步操作&#xff0c;就可以在浏览器和node.js中生成大…

C++代理类,句柄(智能指针)_C++沉思录笔记

代理类 首先定义三个类: class Animal{ public:virtual void getName()0;virtual void clone()0; };class Cat:public Animal{ public:void getName(){cout<<"this is Cat"<<endl;}Animal* clone(){return new Cat;} };class Dog:public Animal{ public:…

浅析C语言的一个关键字——register

1、register修饰符暗示编译程序相应的变量将被频繁地使用&#xff0c;如果可能的话&#xff0c;应将其保存在CPU的寄存器中&#xff0c;以加快其存储速度。例如下面的内存块拷贝代码&#xff0c; /* Procedure for the assignment of structures, */ /* if the C compiler doe…