drools规则引擎并发结果不准确问题记录

news2024/9/24 11:27:42

思路

首先,drools的整体思路比较简单,一个是加载,一个是执行! 加载:把一个比较复杂的关系运算想办法放到drools里面!
执行:让drools去计算这个复杂的运算,最终我们只需要取结果就好!

用法

加载的方式有很多,可以通过xml,也可以通过drl,也可以maven构建,官网有详细的demo,可以直接拿来用,也有很详细的文档可以参考,github上也有从数据库加载的,看各自项目吧,我们是直接把运算的关系表达式串扔进drools里用的,不同项目适合的方式不一样!

问题

我们的业务场景,会有很多规则先加载,然后等请求到了,同一时间,会有大量请求去执行已经加载好的规则,刚开始一切正常,但是后来发现,并发执行超过30多次、50多次、60多次以上,同样的条件,drools执行完给出的结果就不准确了,还是没有规律的不准确,经过大量的调试、查找,最终定位到是kieBase的问题,因为new
kieBase().newKieSession(),执行完是正确的,但是new好的kieBase放内存里,再拿出来直接调用newKieSession(),结果就不准确了,但是每次都创建新的kieBase,并发大的情况下,平均时间会超过1.5秒,这是不可忍受的,所以就不能每次都new
kieBase。但不new的情况下,为什么前几十次是正确的,后面就不准确了,new的时候它里面做了什么?

部分源码如下: 我们用的KieHelper,它直接build(),相当于new kisBase();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一直到kieBase创建结束,也没发现什么特别的地方,看起来都很正常!不过定位的问题我相信是没错的,几种加载规则的方式我都试了,都逃不过kieBase的不准确问题,现象表现的很明显,问题就是出在kieBase,于是又只针对kieBase的问题查找了一番,偶然发现一个小伙伴遇到的是超过20次出现转换异常的问题,他的做法是禁用了JIT编译器,抱着试一试的心态同样禁用了一下,好家伙,真的没问题了!!!

回想上面的源码,发现new KieBase()的时候,确实没管过它的默认配置,看下配置:

在这里插入图片描述
在这里插入图片描述

确实默认配置里面的jittingThreshold默认值是20,而我们没有类型转换的问题,所以它超过20次才表现出来不准确的问题,所以它是超过20是不保证准确,并不是一定不准确,至此,问题解决!

顺便贴一下代码:

KieServices kieServices = KieServices.Factory.get();
KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();
            kieBaseConfiguration.setOption(ConstraintJittingThresholdOption.get(-1));//禁用jittingThreshold(阈值默认20,设为-1)
            KieSession kieSession = KieHelper.addResource(ResourceFactory.newByteArrayResource(drl.getBytes(StandardCharsets.UTF_8)),ResourceType.DRL).build(kieBaseConfiguration).newKieSession();
            kieSession.insert(session);
            kieSession.fireAllRules();
            kieSession.dispose();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

广域网技术——SR-MPLS技术基础理论讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

详解设计模式:模版方法模式

模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使…

若依框架RuoYi项目运行启动教程【傻瓜式教程】

启动若依项目 1.官网下载代码 若依官网 若依在线文档 首先去官网下载代码 链接到码云下载,要么用git下载要么压缩包下载。 然后再IDEA打开项目 想要运行就要搭建好环境 2.搭建若依环境 按照文档要求配置环境 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推…

Stable Diffusion 2.0 来了

Stable Diffusion 一经发布,就立刻在业界掀起巨大的波浪。我个人后知后觉,直到 Stable Diffusion V1.4 版本发布,才接触 Stable Diffusion (之前使用的是 Disco Diffusion)。这段时间,SD 团队也没闲着,很快就发布了 V2…

【华为上机真题 2022】停车场车辆统计

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

【Python】推荐三个好玩的图像处理库

1. 引言 Python是一门高级语言,它可以实现很多功能。Python强大的原因是什么?某种程度上,在于它所拥有的现成的库,使其在编程的各个方向上都易于使用。在本文中,我将向大家展示一些Python库,这些库非常有用…

node.js的模块化

目录 一、模块化的概念 1.什么是模块化 2.编程领域中的模块化 二、node.js中模块的分类 三、require() 加载模块 四. 模块作用域 五、module对象 六、module.exports对象 七、exports对象 八、CommonJS规定: 九、关于包(第三方模块) 十、解决…

阿里P8高级专家,耗时多年整理SpringBoot指南文档

前言 相信程序员们已经看过甚至动手操作过很多的springboot项目,在项目操作中需要各种插件的支持,其实,可能还有很多大家不知道的但是很方便的操作,小编今天就给大家把这份PDF分享出来,绝对是你以前没有见到过的。 1、…

springboot读取yml文件中的list列表、数组、map集合和对象

前言 springboot配置文件yml类型简单的风格,十分受大家的欢迎,支持字符string类型,支持列表list类型,支持集合map类型,支持数组array类型,支持类对象类型,下面我们来实战下这些形式的配置如何取…

聚观早报 | 国美电器被申请破产清算;首款太阳能汽车投入生产

今日要闻:网传国美电器被申请破产清算;全球首款太阳能汽车投入生产;苹果头显配套系统已改名为xrOS;马斯克计划植入脑机接口设备;特斯拉即将推出自动驾驶出租车网传国美电器被申请破产清算 12 月 2 日消息,据…

网站都变成灰色,有哪些方法可以快速实现?

有些时候我们需要把网站页面变成黑白色或灰色,特别是对于一些需要悼念的日子,以及一些影响力很大的伟人逝世或纪念日的时候,都会让网站的全部网页变成灰色(黑白色),以表示我们对逝者或者英雄的缅怀和悼念。…

在校大学生如何申请软著,手把手教会你(内有免费模板)

目录 一.前言 二.以学校为单位全流程申请(以我的学校为例) 1.问问导员谁负责管软著申请这块的,联系他,问需要什么。 2.为了防止学生买软著转头申请 3.按以下要求准备材料 4.没问题就发给老师,一般要破费一下 5.…

View基础知识-位置大小和滑动

前言 这篇文章可以作为基础看看,但是有时候基础就是细节,不一定所有人都记得,所以基础也要记录一下。都熟悉的话也可以看看其他系列文章: View事件分发机制(源码分析篇) Android一步一步追踪View的工作原…

【车辆动力】基于Matlab模拟停车动力学

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Python 音频处理以及可视化 Amplitude,MFCC,Mel Spectrogram, librosa 库

利用python库 librosa库对于音频文件进行预处理,以及可视化操作。 1. Load Audio Data 导入音频 将音频文件(这里使用苹果录音文件 .m4a 格式)导入librosa,音频格式可以为其它(甚至视频文件mp4也是可以的&#xff09…

【Docker】Dockerfile:常见保留字、使用案例

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 官网:链接 构建三步骤 编写Dockerfile文件构建镜像:docker build用镜像运行容器实例:docker run 一、常用的保留字 二、使用案例 要…

Spring MVC统一异常处理的3种方式(附带实例)

在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的、不可预知的异常需要处理。 如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一&a…

html5期末大作业:基于html+css+javascript+jquery+bootstarp响应式图书电商HTML模板网上书店(25页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

STC 51单片机51——直流电机PWM

//开发板按钮K3和K4用于调速,直流电机接部件电机模块Vcc和O1 #include"reg52.h" #define u8 unsigned char #define u16 unsigned int sbit O1P1^0;//ULN2003 sbit K3P3^2; //减速 sbit K4P3^3; //加速 u8 Flag; u16 T, PWM, Temp;//T为控制周期…

Java项目:ssm赛事打分系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 赛事评分系统,SSM框架。该项目分管理员、裁判、选手三个用户角色。 管理员主要功能: 首页、选手管理、裁判管理、赛事管…