流口水与我的事实不符

Drools does not match my fact

我是 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" 不匹配?

谢谢!

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

我不知道确切的机制,但为了启用快速热重载(即使方法签名发生变化),spring-boot-devtools 必须与 JVM 混淆并代理一些对象,在我的例子中,事实。由于这个和 Drools 匹配事实的方式,规则没有触发。

我所要做的就是删除对 spring-boot-devtools 的 Maven 依赖。

规则不匹配,因为您的事实 (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.propertieshere:
restart.include.drools=/drools-[\s\S]+\.jar restart.include.kie=/kie-[\s\S]+\.jar 所以 Drools 加载了 Restart Classloader - 与您的 类.

相同

我有一个问题,即插入的事实在规则中永远不会被识别,但在全局变量中没有问题。

删除

spring-boot-devtools

依赖让我的生活更轻松。