0

我是流口水的新手,并定义了两条规则:

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”类型的事实匹配

那么为什么规则“rule2”不匹配?

谢谢 !

4

3 回答 3

4

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

我不知道确切的机制,但为了启用快速热重载(即使方法签名发生更改),spring-boot-devtools 必须与 JVM 混淆并代理一些对象,在我的情况下,这是事实。由于这一点以及 Drools 匹配事实的方式,该规则没有触发。

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

于 2017-06-22T09:46:27.110 回答
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 ,正如这里所暗示的那样:
restart.include.drools=/drools-[\\s\\S]+\.jar restart.include.kie=/kie-[\\s\\S]+\.jar 所以 Drools 加载了 Restart Classloader - 与您的类相同。

于 2018-02-14T12:48:18.420 回答
0

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

移除

弹簧引导开发工具

依赖让我的生活更轻松。

于 2020-05-17T12:01:35.547 回答