使用Java脚本引擎实现可配置化规则

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangzw0505/article/details/90670552

我的更多文章可访问:https://zhangzw.com/

提出问题

  • 在有些项目中存在大量经常变化的规则逻辑,比如审核、风控规则。
  • 如果规则硬编码在Java代码中,每次修改规则都要重新修改代码、测试、重启发布,很麻烦。

解决思路

  • 从JDK6开始,Java提供了ScriptEngine接口,支持执行解释性语言,例如Javascript。使得可在Java代码中执行Javascript代码。
  • ScriptEngine提供了eval方法,可执行传入的Javascript字符串或流形式的代码块。
  • 这样,整个Script脚本就相当于配置文件独立于代码之外。我们可以将其保存在配置中心、数据库或Zookeeper中,方便及时响应业务变化。

示例

下面举个简单的例子(深圳小汽车摇号政策)

新建rool.js脚本文件,里面维护具体的规则逻辑。

// 定义因子
var
    RESIDE_CITY, // 居住地
    HAS_DRIVER_LICENSE, // 是否有C以上驾照
    HAS_CAR, // 是否有本地小汽车
    o;

// 定义规则函数
function doRool() {
    if (RESIDE_CITY != '440300') {
        return "非本地居住";
    }
    
    if (HAS_DRIVER_LICENSE != 'Y') {
        return "无C以上驾照";
    }
    
    if (HAS_CAR != 'N') {
        return "本地已有小汽车";
    }
    
    return ""; // 没有被拦截。
}

// 执行规则
doRool();

Java代码执行rool.js

String js = FileUtils.readFileToString(new File("D:/rool.js")); // 读取脚本。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");

// 向脚本传递参数
engine.put("RESIDE_CITY", "440300");
engine.put("HAS_DRIVER_LICENSE", "Y");
engine.put("HAS_CAR", "Y");

// 执行并打印
System.out.println(engine.eval(js));

>:本地已有小汽车
展开阅读全文

没有更多推荐了,返回首页