初步看QLExpression基本也能达到drools的规则定义和执行的能力。但Drools的语法学习较高,后期可能多人维护困难。

QLExpression

特点

可以和spring完美结合,脚本中可以调用spring的bean方法,java类的属性、方法、创建java对象

image.png

带着问题走读

  • 执行过程的具体步骤要debug清楚,栈虚拟机的设计是怎样的(QLExpress的这套自定义的指令集属于解析执行,RunEnvironment中通过programPoint函数指针的跳转来实现每条指令的逐个计算,通过dataContainer作为栈来存储中间计算结果。)
  • 是如何做到支持大部分java语法的?
  • 弱类型语言,是如何支持不同类型的四则运算的,比如1+1.0结果会变为2.0,而不是2,1+“1”=“11”而不是2(官方说明:QLExpress属于弱类型脚本语言,一般不推荐声明局部变量的类型。语法编译阶段不会做类型校验,也不会做方法的参数校验,所以很灵活)
  • 语法解析是怎么做的?
    • 缓存逻辑
  • 在上下文中,和spring的结合点是什么。具体如何做到的
  • 执行逻辑是怎样的?

典型的使用场景:替代一堆if else逻辑;可以定义非常语义化的规则

image.png

核心概念

操作符:可以定义别名,if else > 等为内置真实操作符名称
image.png

方法:将方法注册到runner
image.png

设置上下文变量并执行表达式
image.png

核心执行流程

  1. 解析表达式,生成指令集-InstructionSet(分析出脚本中包含的function,变量,操作符,语法树结构等)
  2. 一步步执行InstructionSet中的每个Instruction,Instruction的类型是收敛的,比如调用宏、执行一个自定义函数、执行一个操作符计算等。这里涉及到“offset”/“programPoint”的概念(com.ql.util.express.RunEnvironment#programPoint),指导执行的过程。

核心点是InstructionSet的生成过程,以及执行过程。需要继续研究这两个步骤,尤其是后者(如何决策执行步骤的,为什么可以一步步的执行)

drools

主要问题

特点

以交通处罚为例(驾驶员违反交通规则就扣分/罚款,如何扣/罚,以及如何判断驾驶员该被suspend了)

构建DAG图(DMN)
image.png

Defining the traffic violations DMN decision logic

image.png
image.png