初步看QLExpression基本也能达到drools的规则定义和执行的能力。但Drools的语法学习较高,后期可能多人维护困难。
QLExpression
特点
可以和spring完美结合,脚本中可以调用spring的bean方法,java类的属性、方法、创建java对象
带着问题走读
- 执行过程的具体步骤要debug清楚,栈虚拟机的设计是怎样的(QLExpress的这套自定义的指令集属于解析执行,RunEnvironment中通过programPoint函数指针的跳转来实现每条指令的逐个计算,通过dataContainer作为栈来存储中间计算结果。)
- 是如何做到支持大部分java语法的?
- 弱类型语言,是如何支持不同类型的四则运算的,比如1+1.0结果会变为2.0,而不是2,1+“1”=“11”而不是2(官方说明:QLExpress属于弱类型脚本语言,一般不推荐声明局部变量的类型。语法编译阶段不会做类型校验,也不会做方法的参数校验,所以很灵活)
- 语法解析是怎么做的?
- 缓存逻辑
- 在上下文中,和spring的结合点是什么。具体如何做到的
- 执行逻辑是怎样的?
典型的使用场景:替代一堆if else逻辑;可以定义非常语义化的规则
核心概念
操作符:可以定义别名,if else > 等为内置真实操作符名称
方法:将方法注册到runner
设置上下文变量并执行表达式
核心执行流程
- 解析表达式,生成指令集-InstructionSet(分析出脚本中包含的function,变量,操作符,语法树结构等)
- 一步步执行InstructionSet中的每个Instruction,Instruction的类型是收敛的,比如调用宏、执行一个自定义函数、执行一个操作符计算等。这里涉及到“offset”/“programPoint”的概念(com.ql.util.express.RunEnvironment#programPoint),指导执行的过程。
核心点是InstructionSet的生成过程,以及执行过程。需要继续研究这两个步骤,尤其是后者(如何决策执行步骤的,为什么可以一步步的执行)
drools
主要问题
- 能定义什么样的规则?
- 有哪些实体,关系?如何执行的?
- DMN上如何表达一个 复杂的 if xxx else 逻辑
特点
- 支持图形化界面构建逻辑图,并直接获取执行结果
- 支持复杂事件处理(CEP),事件的概念以及能达到的效果见(还没太理解)https://docs.jboss.org/drools/release/7.49.0.Final/drools-docs/html_single/index.html#cep-con_decision-engine
以交通处罚为例(驾驶员违反交通规则就扣分/罚款,如何扣/罚,以及如何判断驾驶员该被suspend了)