KieServer多线程场景下多默认KieBase告警及部署失败问题咨询
问题根因分析
核心原因均为默认Kie资源的配置冲突:
- 初始告警来自依赖的2个项目,每个都配置了默认的KieBase、KieSession、StatelessKieSession,当前项目运行时检测到多份默认资源,自动禁用了所有默认配置,所有资源仅能通过名称调用
- 手动配置2个Stateless KieSession后未指定默认实例,而
Per request运行时策略默认会调用全局默认KieSession处理请求,找不到就抛出java.lang.RuntimeException: Cannot find a default KieSession错误 - 多线程处理能力受限和默认资源禁用无直接关联,是
Per request策略本身每个请求会独立创建KieSession实例,叠加默认资源禁用后的额外查找步骤导致的性能瓶颈
解决方案
步骤1:清理依赖项目的默认配置
检查2个依赖项目的kmodule.xml文件,移除所有default="true"的配置,确保仅当前主项目可配置默认Kie资源
步骤2:调整当前项目kmodule配置
1个KieBase搭配2个Stateless KieSession的配置规则如下:
- 保留唯一KieBase的
default="true"属性 - 2个Stateless KieSession中保留1个设为默认,另一个仅配置name属性用于显式调用
示例配置片段:
<kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="mainKBase" default="true" packages="com.your.business.rules"> <ksession name="defaultStatelessSession" type="stateless" default="true"/> <ksession name="customStatelessSession" type="stateless" default="false"/> </kbase> </kmodule>
步骤3:调整多线程调用逻辑
需要同时使用2个Stateless KieSession做并行处理时,不要走默认调用链路,显式通过Session名称获取对应实例:
- 调用Kie Server API时在请求头添加
X-KIE-SESSION: {自定义Session名称}指定调用对象 - 代码侧调用时使用
kieContainer.newStatelessKieSession("customStatelessSession")显式获取实例
步骤4:运行时策略优化
如果规则无状态、无全局变量修改操作,可将运行时策略从Per request调整为Singleton,复用会话实例大幅提升多线程处理性能,Stateless KieSession本身线程安全,无并发风险
验证操作
调整配置后重新部署项目,确认server.log无多默认资源告警,两个Session均可正常调用,多线程压测下QPS符合预期即可。
内容的提问来源于stack exchange,提问作者Jovana Vajagic
相关产品推荐
相关产品推荐

