easy-rules源码分析图谱
2023-06-07 20:17:47 0 举报
开源规则引擎框架easy rules的执行原理。
作者其他创作
大纲/内容
add
规则构建
add(rule)
通过JSON构建JsonRuleDefinitionReader
构建ruleDefinition (4种类型构建:mvel、spel、builder、new)跟构建BeanDefinition最终解析为bean,加载到spring容器有相同思想。开发者在此可以自定义构建自己的ruleDefinition,以此插入到 ruleDefinitionList中,交给easy Rules 进行注册
判定容器中是否存在fact
MVEL构建rule
与mvel过程大致相似
候选者名单不为空
添加到容器中
如果表达式为false
rule.evaluate(facts);执行,捕获runtimeException
捕获异常
newProxyInstance()
判断是否捕获Exception
Definition的定义: private String name = Rule.DEFAULT_NAME; private String description = Rule.DEFAULT_DESCRIPTION; private int priority = Rule.DEFAULT_PRIORITY; private String condition; private List<String> actions = new ArrayList<>(); private List<RuleDefinition> composingRules = new ArrayList<>(); private String compositeRuleType;
判断evaluationResult
facts.remove( \"paramJson\" )
是
判断skipOnFirstAppliedRule是否为true,若为true,则全局中断 break
api
解释a: 绿色部分为框架向外暴露的扩展b: 红色部分触发可随时中断整个规则执行,属于流程控制规则c: 白色部分且为实现连接表示主流程d: 黄色部分表示主要api方法
开始执行引擎fire
判断skipOnFirstFailedRule是否为true,若为true,则全局中断 break
getFact(\"paramJson\")
后选择名单不为空,回调
判断skipOnFirstNonTriggeredRule是否为true,若为true,则全局中断 break
全局规则中断判定:if (priority > parameters.getPriorityThreshold()) { break; //优先值超出 threshold 的设定。 //立即退出执行规则}
没有异常
通过map构建AbstractRuleDefinitionReader
捕获到异常
执行监听器ruleListener.onEvaluationError方法需要开发者实现
否
rules注册和注销
推理执行InferenceEngine引擎
从容器中删除
判断条件:rule.evaluate(facts)为true,添加到候新选者名单,顺序与原自然顺序保持一致
根据ruleDefinition构建rule
构建definition3种方式:createRuleDefinition( )
结束
annotation
fact插入facts.put(\"paramMap\
执行actionrule.execute(facts);
表达式为true
容器:Set<Rule> rules = new TreeSet<>();
SPEL构建rule
ruleBuilder
trigger listener 执行引擎前foreach(font color=\"#323232\
接口:RuleDefinitionReaderList<RuleDefinition> read(Reader reader)
开发者自定义的SpelRuleEngineListener实现方法beforeEvaluate()执行说明:绿色部分全部为listener的实现回调
通过yml文件构建YamlRuleDefinitionReader
容器:final Set<Fact<?>> facts = new HashSet<>();
收藏
0 条评论
下一页