声明:
1、本次解决方案,仅适用drools 版本7.X,最新的8.X不清楚官方是否已修复此bug,我也没有去验证,感兴趣的同学可以自己去测试一下。
2、出现问题时的环境:操作系统Win11,Idea2021.1,JDK1.8.0_211
3、如果通过本次文章还没有解决问题,可以私信我。
4、Drools官网:Drools - Drools - Business Rules Management System (Java™, Open Source)
一、前言
首先大家遇到导致崩溃的原因不尽相同,所以自己先了解透了drools是什么,运行原理后,同时JVM的内存给的足够大后,并在用的过程中一定要主动释放资源,代码如下:
KieSession kieSession = kieBase.newKieSession();
FactHandle handlefj11Data = kieSession.insert(fj11Data);
kieSession.fireAllRules();
kieSession.delete(handlefj11Data);//释放资源
kieSession.dispose();
满足以上条件后,还出现20次崩溃魔咒的情况,那么咱们可能是遇到了同一个问题。那你可以继续往下看了。
二、问题表象
============== DEBUG MESSAGE: illegal bytecode sequence - method not verified ================
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_PRIV_INSTRUCTION (0xc0000096) at pc=0x00000251502459dd, pid=15424, tid=0x0000000000004250
#
# JRE version: Java(TM) SE Runtime Environment (8.0_261-b12) (build 1.8.0_261-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# j ConditionEvaluator504f0cef2aeb46d49c660e07bfa907fd.evaluate(Lorg/drools/core/common/InternalFactHandle;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/spi/Tuple;)Z+9
#
It looks like something to do with class loading, but I tried removing spring-boot-devtools from the pom file and it didn't help.
这里只说一点,崩溃问题跟JDK版本半毛钱关系也没有,所以更换JDK版本是徒劳。信者继续,其他绕行。
三、解决方案
出现20次崩溃的写法:
rule "CollapseCurses20"
no-loop true
lock-on-active true
salience 1
when
$Entity:DataEntity(isNullOrZero(9999d))
then
errorMsg.put("msg","魔咒出现!!!");
end
function Boolean isNullOrZero(Double value){
if(value==null || value==0d || "0".equals(value.toString()))
{
return true;
}
return false;
}
解决20次崩溃的写法:
rule "CollapseCurses20"
no-loop true
lock-on-active true
salience 1
when
$Entity:DataEntity(isNullOrZero(0d))
then
errorMsg.put("msg","魔咒解除!!!");
end
function boolean isNullOrZero(Double value){
if(value==null || value==0d || "0".equals(value.toString()))
{
return true;
}
return false;
}
在drl文件中,可以通过function来定义一些方法在When里面来使用,并且一般定义的方法大部分都会返回boolean值,然后的然后我们就掉坑了,方法返回的值不能使用对象类型的Boolean,方法体内不能使用 Boolean来定义变量,只能用boolean,且仅布尔值会出现崩溃的问题。所以只要批量把Boolean换成boolean问题完美解决了。为了保险起见,批量跑了1个多小时规则,问题没有出现!
如果看到这里问题还没解决的话,就私信我吧!祝各位安好!!!