规则引擎

原创
2021/09/30 11:53
阅读数 300

概述

简单规则引擎,支持任务流形式规则处理 项目地址

支持的流程如下:

graph TD
1((开始节点1)) -->|2=1.next | 2((节点2))

2((节点2)) -->|3=2.next | 3((节点3))
2((节点2)) -->|4=2.next| 4((节点4))

3((节点3)) -->|5=3.next| 5((节点5))
4((节点4)) -->|6=4.next| 6((节点6))

6((节点6)) -->|7=6.next| 7((节点7))
6((节点6)) -->|8=6.next| 8((节点8))
6((节点6)) -->|9=6.next| 9((节点9))

7((节点7)) -->|10=7.next| 10((节点10))
8((节点8)) -->|10=8.next| 10((节点10))

5((节点5)) -->|11=5.next| 11((节点11))
7((节点7)) -->|11=7.next| 11((节点11))

适用

1、Flow形式流程定义和执行

  • 支持条件分支和条件合并
  • 不支持DAG
  • 暂不支持嵌套运算符(可扩展实现,实现Antlr的Listener对象即可)

2、需搭配mysql运行

数据结构

包括以下三层,以及其对应关系

1、flow

2、task

3、rule

模块说明

DSL

基于 Antlr4,对应两个文法定义文件在 flow/dsl/conf 下:

  • Calculator:用于正向执行,包括:
    • 【本节点要执行的操作】,对应内容来自 t_task_rule.content 字段
    • 【下一个可能满足开启条件的节点】,对应内容来自 t_flow_task.next 字段
  • Topology:用于反向判断
    • 【某节点是否满足开启条件】,对应内容来自 t_flow_task.pre 字段

model

DB操作相关,包括部分在 resources/mapper/ 下

entity

whatever这个名字,是 runtime 直接使用的对象

runtime

主要执行逻辑,包括 DSL 的非生成部分 两种模式在 FlowSession 初始化时设定

runtime/visitor

DSL 的 visitor 实现

  • 不支持嵌套计算式

runtime/listener

DSL 的 listener 实现

  • 支持嵌套计算式(可参看test下的示例)
  • TODO:preCondition的处理(对应 TopologyVisitorExecutor)

其他

测试数据

test_data.sql:测试用flow配置

规则表达式支持嵌套的实现

通过 Listener 方式实现 (TaskRuleListenerExecutor)

FAQ

规则(计算式)格式

  • 逗号:以逗号结尾,只是 DSL 文法上更明确,并不影响实际生成 tree (会有个扎眼的红色警告)

DSL两种模式:visitor 和 listener

  • Visitor中,可以自行控制遍历的方法/顺序
    • 传递信息
      • 输入:通过 context 的方式传递,有自动生成的代码管理,可修改但不好把控
      • 输出:可用return的方法向外返回
    • 必须指定(返回值)类型,这个会带来一些处理不便
  • Listener中,无法控制遍历顺序
    • 传递信息需要自己处理,一般类中会自定义数据体(如,TaskRuleListenerExecutor.memory )
    • 外部获取值,要么通过约定key/变量来处理,要么通过类似 xxx.getValue(tree) 读取根节点的对应输出
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部