规则引擎能够将业务决策逻辑从系统逻辑中抽离出来,使两种逻辑独立于彼此而变化,这样可以明显降低两种逻辑的维护成本。
比如说在物联网平台中,连接的设备种类繁多,数据格式,数据类型不统一,但又要面临接入新设备的需求,不能说每接入一种设备,都要写一套设备数据处理的逻辑,然后升级发布系统的功能,设备处理逻辑可以写,但要能最低限度的影响平台的功能。这个时候,我们最好需要一套规则引擎来灵活的处理各种设备的数据。
已经知道了为什么要做规则引擎,要怎么处理呢,参考QLExpress使用说明文章: www.jianshu.com/p/c1fa9c4a0…
QLExpress是一种Java的规则引擎,可以动态的执行脚本,并且可以绑定一些我们写好的Java函数作为动态执行脚本的操作。那么我们将数据处理中最通用的内容封装为一个个QLExpress的组件,在数据处理的时候直接拿来使用即可。其实我们可以考虑只是数据的处理,可能会有哪些组件:
我觉得上面这几个组件可以满足大部分的数据场景了,有来源,有处理,有反馈。当然在业务复杂的情况下,可能会不断的增加新的组件,但是每次增加要想一想, 这个组件真的有需要吗?
另外因为QLExpress已经支持动态脚本了,具有一定编程语言的特性,足够的灵活处理,封装我们的组件只是为了那些更加通用,常用的场景,而最通用的东西一般不会很多。
1 整理好系统中最常用的功能,进行封装,将最常用的功能以某种方式(配置文件,动态加载),注册为QLExpress的某个操作符上。如下
runner.addFunctionOfClassMethod("取绝对值", Math.class.getName(), "abs", new String[] { "double" }, null); runner.addFunctionOfClassMethod("转换为大写", BeanExample.class.getName(), "upper", new String[] { "String" }, null); runner.addFunctionOfServiceMethod("打印", System.out, "println",new String[] { "String" }, null); runner.addFunctionOfServiceMethod("contains", new BeanExample(), "anyContains", new Class[] { String.class, String.class }, null); 复制代码
2 在不同的业务场景下,编写QLExpress语句,可以利用上一步注册到QLExpres上的功能简化语句。 虽然是动态脚本但是要足够简单,业务要做到不用写几句代码就能满足这次需求 ,如果要写太多的语法,那就有点不太友好了。
3 在每个编写的规则上,提供规则执行测试脚本,数据隔离防止产生脏数据,校验规则脚本能否正确执行。
4 将规则引擎的功能集成到平台上。