【解决】drools 执行20次失败中断崩溃的问题

声明:

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个多小时规则,问题没有出现!

如果看到这里问题还没解决的话,就私信我吧!祝各位安好!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值