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

Java脚本 规则引擎

提出问题

  • 在有些项目中存在大量经常变化的规则逻辑,比如审核、风控规则。
  • 如果规则硬编码在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));

>:本地已有小汽车
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,698评论 0 13
  • 0. 写在前面 当你开始工作时,你不是在给你自己写代码,而是为后来人写代码。 —— Nichloas C. Zak...
    康斌阅读 10,740评论 1 42
  • 昨天,趁着周末刷了部日剧《woman》,这个故事讲述的是女主角小春如何与因为受到家庭暴力而离开家庭的母亲化解误会,...
    鱼耗子阅读 1,326评论 0 0
  • 作者:演协信息部 摄影:黄佳莉 2017年10月21日下午17:30,演讲协会(以下称“演协”)在教学楼2...
    演讲协会阅读 3,496评论 0 5
  • 周六 阴雨 贞毅生病,上午参加了一个很搞笑的考试,然后,读了一段话,本杰明给一个青年人的教育,一分钟的故事,果然 ...
    麦子时光_新浪阅读 14,407评论 0 0