Spring Boot Drools无法在Sping Boot 项目中加载规则

tpgth1q7  于 2023-03-02  发布在  Spring
关注(0)|答案(5)|浏览(275)

我在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 应用程序运行时,它工作正常。**请帮助。

kxeu7u2r

kxeu7u2r1#

这似乎是KieServices和Sping Boot Uber jar中的一个bug。这里发布了一个工作:https://groups.google.com/forum/#!topic/drools-usage/odQjmBess5A
基本上,配置 Boot 插件来解压缩kiejar。

<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>
cngwdvgl

cngwdvgl2#

确保具有以下依赖项

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依赖项(如果有)。
(This为我工作。)

monwx1rj

monwx1rj3#

当使用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

相关Spring文档

krcsximq

krcsximq5#

在升级到java17和最新版本的drools 8.34.0.Final(从7.x版)后,我遇到了类似的问题。规则不再位于kmodule.xml文件中。关于问题根源的提示是控制台日志(很容易忽略):

2023-02-23 15:01:35.467546300 DEBUG 18840   [DEX    ] [main] o.d.c.k.b.i.ClasspathKieProject          :423 : KieModule URL type=file url=/C:/aaa/target/classes
2023-02-23 15:01:35.467546300 ERROR 18840   [DEX    ] [main] o.d.c.k.b.i.ClasspathKieProject          :143 : Unable to build index of kmodule.xml url=file:/C:/aaa/target/classes/META-INF/kmodule.xml
You're trying to perform a xml related operation without the necessary xml support for drools. Please add the module org.drools:drools-xml-support to your classpath.

解决方案是添加带有xml支持的新发布的jar:

<dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-xml-support</artifactId>
            <version>${drools-version}</version>
        </dependency>

注意:所有需要的插件和jar都列在下面,而且我仍然有这个<requiresUnpack>选项,你可以在另一个答案中找到

<plugin>
                <groupId>org.kie</groupId>
                <artifactId>kie-maven-plugin</artifactId>
                <version>${drools-version}</version>
                <extensions>true</extensions>
            </plugin>
            
                      <!-- Drools -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-bom</artifactId>
            <type>pom</type>
            <version>${drools-version}</version>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>${drools-version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.thoughtworks.xstream</groupId>
                    <artifactId>xstream</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools-version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-mvel</artifactId>
            <version>${drools-version}</version>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-xml-support</artifactId>
            <version>${drools-version}</version>
        </dependency>

相关问题