Drools 无法在 Spring 引导项目中加载规则

Drools not able to load rules in Spring Boot Project

我在 spring 引导项目中使用 Drools 7.5.0-final。

我正在开发一个多模块 Gradle 项目。 规则和 kmodule.xml 存在于子模块项目中。这个模块被打包成一个 Jar 在一个 fat spring 引导 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 并打印所有 kbase 和 sessionName。

但是当我触发规则时 returns zero rules fired.

当我 运行 作为 spring 从 Eclipse 引导应用程序时它工作正常。 请帮忙。

这似乎是 KieServices 和 SPring Boot uber jar 中的错误。这里有一个解决方法: https://groups.google.com/forum/#!topic/drools-usage/odQjmBess5A

基本上,配置 Spring Boot Maven 插件来解压 kie jar。

         <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <requiresUnpack>
                        <dependency>
                            <groupId>com.sample</groupId>
                            <artifactId>kproject1</artifactId>
                        </dependency>

                       <dependency>
                           <groupId>com.sample</groupId>
                           <artifactId>kproject2</artifactId>
                       </dependency>
                    </requiresUnpack>

                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

确保你有以下依赖项

implementation group: 'org.kie', name: 'kie-api', version: '7.16.0.Final'
implementation group: 'org.drools', name: 'drools-core', version: '7.16.0.Final'
implementation group: 'org.drools', name: 'drools-compiler', version: '7.16.0.Final'
implementation group: 'org.kie', name: 'kie-spring', version: '7.16.0.Final'

并删除 spring-boot-devtools 依赖项(如果有的话)。

(这对我有用。)

使用 spring-boot-devtools 时,这是因为您的事实通常使用 "Restart Classloader" 加载,而您的 Drools 类 使用 "Base Classloader" 加载。因此,执行规则时事实对象不匹配。

我也通过为 Drools 类 使用 "Restart Classloader" 解决了这个问题,方法是在我的 spring-boot-application 中创建一个文件 src/main/resources/META-INF/spring-devtools.properties,内容如下:

restart.include.dools=/(drools|kie)\-.*\.jar

Related spring docs

这是 Drools 中的错误,已在这个 JIRA 下解决: https://issues.redhat.com/browse/DROOLS-2311?_sscc=t