【问题标题】:Drools not able to load rules in Spring Boot ProjectDrools 无法在 Spring Boot 项目中加载规则
【发布时间】:2018-02-07 15:48:35
【问题描述】:

我在spring Boot项目中使用的是Drools 7.5.0-final。

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

但是当我触发规则时,它会返回 zero rules fired

当我从 Eclipse 作为 Spring Boot 应用程序运行时,它运行良好。 请帮忙。

【问题讨论】:

  • 还有其他人遇到同样的问题吗?如果它有助于解决问题,我有一个复制器。

标签: spring spring-boot drools business-rules kie


【解决方案1】:

这似乎是 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>

【讨论】:

    【解决方案2】:

    确保你有以下依赖项

    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 依赖项(如果有)。

    (这对我有用。)

    【讨论】:

      【解决方案3】:

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

      我也通过对 Drools 类使用“重启类加载器”解决了这个问题,方法是在我的 spring-boot-application 中创建一个文件 src/main/resources/META-INF/spring-devtools.properties,其中包含以下内容:

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

      Related spring docs

      【讨论】:

      • 我没有使用开发工具
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 2021-01-21
        • 2018-10-12
        • 1970-01-01
        • 2014-06-25
        • 2017-09-06
        • 1970-01-01
        相关资源
        最近更新 更多