最近公司的开发任务是规则引擎
这个东西。 大概想要做成的东西是这个亚子。
于是领导调查了一下,让我去看drools这个框架。
具体drools怎么用网上很多博客都有讲,我会把参考到的几个写的比较清楚的帖子贴在下面。
初识drools
第一次去看的时候,仅仅只是跟着demo走了一下,跟着写了一下drl,发现这个框架需要用到他自己的语法。一时间很难接受,于是草率的得出结论: 想要使用这个规则引擎,必须事先写好drl文件,而这个文件又很难生成。 因此这个框架不实用。
再遇drools
第二次去看的时候,深入理解了一下drl语法,也自己试着实现了一些自己的规则,期间踩了很多坑。像 遍历List、 when…then…有没有else啊 这些问题。在这里简单记录一下,等到上班去公司看着代码回忆一下有哪些问题是怎么解决的。
和drools的爱恨纠缠
在上面完成之后,我做出一个很怪的规则出来, 因为命题的链接都是or
因此我认为,只要有一个为true
整个命题就是ture,所以我使用了loop来轮询的判断每个命题,如果发现了一个true,就将结果置为true,并结束循环。
但是这种操作导致了只能做全or
或者全and
的命题连接, 如果出现and和or混用的情况,这是没法做的。
而且在执行的过程中发现了一个致命bug:每当规则执行到第22次的时候,都会报一个严重的错误。以前从来都没见过,而且去问领导,领导也说没见过。产生原因我并不清楚,但是我是将一个判断去除了以后解决的这个问题。所以我猜测可能是条件没写好导致无限循环,使得drools这个框架处理不过来导致的错误。
心满意足的接受drools的服务
再往后,想要支持and和or混用的这种情况,甚至想要支持带括号,有先后优先级的这种情况。我想了好多办法,都不可能做到动态的去判断。 最后只能使用拼接字符串的方法,将条件和逻辑运算符直接写在drl文件里。 将这条规则动态的加入到规则引擎中。
参考文章:
drools6入门例子(二)
Drools 7 遍历List集合
springboot2整合drools规则引擎(kie-spring+drools-core)
drools集成spring boot
drools 如何动态加载规则