Drools是一款流行的Java开源流程规则引擎,正好最近项目需要用到这个框架,在实际的使用过程中就发现了一些点,可能对大家使用Drools有所帮助,我就把它写出来,权当抛砖引玉。
Drools版本: 5.7
1. 关于重复规则的检测
在我的项目中,客户提出需求说能不能在规则匹配的过程中找到哪些规则是重复的,这样他们就可以针对规则来进行调整。我翻遍了Drools的API也没有发现一个API能够提供这种接口,同时也在网上搜索有没有相关的文章,同样也是一无所获。后来没有办法,只能手动Debug Drools的执行过程,期望能发现一丝蛛丝马迹。功夫不负有心人,终于发现了在Drools执行过程中的一个变量【activeActivations】是标记规则匹配数量的。所以我就写了如下的代码来处理重复规则:
这样通过判断变量【activeActivations】的数量就可以达到判断是否发生规则重复的目的,然后还可以取得真正发生重复的规则的名字。
2. 关于Drools API 【fireAllRules】的线程安全问题
首先可以肯定得是这个API不是线程安全的,很不幸这个问题也是在我项目上线两个月之后我才发现的。在项目中为了加快数据处理的速度,我使用了JDK7的多线程框架,然后用这个框架再调用Drools的API,在一次偶然的运行过程中发现包含Drools API的一个定时任务卡住不动了,当时就感觉很奇怪,然后打印出JVM的堆栈信息,发现了在调用Drools API的时候发生了线程死锁。 Log如下:
然后就怀疑这个API是不是线程安全,在Drools的官方论坛上发现了不少Drools API在多线程调用时候发生问题的文章,结果证实证实了这个API就不是线程安全的。然后就在调用这个API的时候加上了同步的控制,开始以为会对程序的性能造成影响,后来发现对性能的影响微乎其微,几乎可以忽略不计。
以上就是在使用Drools5 的过程中发现的一些问题和解决方案,希望遇到同样问题的人可以有些帮助,谢谢大家。
网友评论