Drools与我的事实不符

时间:2017-06-20 08:24:44

标签: drools kie spring-boot-devtools

我是drools的新手,并定义了两条规则:

package com.mgaudin.sandbox.drools.rules;

import com.mgaudin.sandbox.drools.models.Lead;

rule "rule1"
    when
        l: Object()
    then
        System.out.println(l.getClass().getCanonicalName());
end

package com.mgaudin.sandbox.drools.rules;

import com.mgaudin.sandbox.drools.models.Lead;

rule "rule2"
    when
        Lead()
    then
        System.out.println("It's a match !");
end

当我插入新的com.mgaudin.sandbox.drools.models.Lead事实时,输出如下:

com.mgaudin.sandbox.drools.models.Lead

因此我们可以推断出:

  1. 规则正确编译
  2. 执行规则
  3. 第一条规则与“com.mgaudin.sandbox.drools.models.Lead”类型的事实匹配
  4. 那么为什么规则“rule2”不匹配?

    谢谢!

3 个答案:

答案 0 :(得分:4)

好的我找到了答案,它与Drools无关,它与Spring-boot-devtools有关!

我不知道确切的机制,但是为了实现快速热重新加载(即使方法签名发生变化),spring-boot-devtools必须弄乱JVM并代理一些对象,在我的情况下,事实。由于这一点和Drools匹配事实的方式,规则没有触发。

我所要做的就是将maven依赖项移除到spring-boot-devtools。

答案 1 :(得分:1)

规则不匹配,因为您的事实(Lead)加载了不同的ClassLoader,所以Drools不会看到它。这是由devtools完成的,如下所述: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-spring-boot-restart-vs-reload

但是没有必要禁用devtools,只需将以下行添加到 META-INF / spring-devtools.properties ,如提示here所示:
restart.include.drools=/drools-[\\s\\S]+\.jar restart.include.kie=/kie-[\\s\\S]+\.jar 所以Drools加载了Restart Classloader - 与你的Classes一样。

答案 2 :(得分:0)

我遇到了一个问题,即插入的事实从未在规则内被识别,但是全局变量没有问题。

删除

spring-boot-devtools

依赖性使我的生活更轻松。