我是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
因此我们可以推断出:
那么为什么规则“rule2”不匹配?
谢谢!
答案 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
依赖性使我的生活更轻松。