我在Spring Boot 项目中使用Drools 7.5.0-final。
我正在处理一个多模块Gradle项目。Rules和kmodule.xml位于子模块项目中。此模块被打包为一个Jar,位于一个fat spring Boot Jar文件中。
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://jboss.org/kie/6.0.0/kmodule">
<!-- <configuration>
<property key="drools.propertySpecific" value="ALLOWED"/>
</configuration> -->
<kbase name="rules.employee.tax" packages="uk.gov.hmrc.itmp.service.application.rules.employee.tax" >
<ksession name="rules.employee.tax.session" type="stateful" />
<ksession name="rules.employee.tax.statelesssession" type="stateless" />
</kbase>
</kmodule>
我从类路径构建容器。
KieContainer kContainer = kieService.newKieClasspathContainer();
在服务器启动时**(java -jar)它加载Kmodule.xml并打印所有知识库和会话名称。
但是当我触发规则时,它返回zero rules fired
**。
**当我从Eclipse作为Sping Boot 应用程序运行时,它工作正常。**请帮助。
5条答案
按热度按时间kxeu7u2r1#
这似乎是KieServices和Sping Boot Uber jar中的一个bug。这里发布了一个工作:https://groups.google.com/forum/#!topic/drools-usage/odQjmBess5A
基本上,配置 Boot 插件来解压缩kiejar。
cngwdvgl2#
确保具有以下依赖项
并删除
spring-boot-devtools
依赖项(如果有)。(This为我工作。)
monwx1rj3#
当使用spring-boot-devtools时,这是因为事实通常使用“Restart Classloader”加载,而Drools类使用“Base Classloader”加载。因此,当执行规则时,事实对象不匹配。
我也通过对Drools类使用“Restart Classloader”解决了这个问题,方法是在我的spring-boot-application中创建一个包含以下内容的文件src/main/resources/META-INF/spring-devtools.properties:
相关Spring文档
gdx19jrr4#
这是Drools中的漏洞,已在此JIRA下解决:https://issues.redhat.com/browse/DROOLS-2311?_sscc=t
krcsximq5#
在升级到java17和最新版本的drools 8.34.0.Final(从7.x版)后,我遇到了类似的问题。规则不再位于kmodule.xml文件中。关于问题根源的提示是控制台日志(很容易忽略):
解决方案是添加带有xml支持的新发布的jar:
注意:所有需要的插件和jar都列在下面,而且我仍然有这个
<requiresUnpack>
选项,你可以在另一个答案中找到