【问题标题】:Drools does not match my fact流口水不符合我的事实
【发布时间】:2017-06-20 08:24:43
【问题描述】:

我是新手,已经定义了两个规则:

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”不匹配?

谢谢!

【问题讨论】:

  • 这是否意味着您似乎有两个 .DRL 文件?都编译成一个 KieBase 吗?如何?你验证过里面有两条规则吗?
  • 两者都编译到同一个 KieBase 中(第一条规则只是为了证明我的 drools 运行正常并显示事实类名称)。我尝试使用 KieFileSystem / KieBuilder 或 KnowledgeBuilder 编译我的规则。两者都编译得很好,但产生了相同的结果。此外,为了确保使用了我的 DRL 文件,我尝试使用 eval(true) 修改相同的文件,输出“It's a match!”。
  • 如果您的故事中没有隐藏的障碍,那么我会说这是一个错误。做一个完整的例子(最低 Java,DRL),说明 Drools 版本并提出一个 JIRA。 - 如果你编辑你的问题,添加所有这些代码和信息,我会调查它。

标签: drools kie spring-boot-devtools


【解决方案1】:

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

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

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

【讨论】:

  • 我可以确认我在使用这些相同的工具时遇到了同样的问题,并且删除 spring-boot-devtools 解决了问题。
  • 面临同样的问题并通过删除spring-boot-devtools得到修复
  • 对我们来说,当我们试图从 spring boot 应用程序中读取此规则作为 kjar 时,就会出现问题。能够弄清楚我们应该保持相同的包结构,以便在条件时在规则中正确加载和识别事实。
【解决方案2】:

规则不匹配,因为您的事实(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 一样。

【讨论】:

  • 这只会在 RestartClassLoader 中保留口水和 kie 罐子,而不是您的事实和自定义类。不保证使用它会解决问题。
【解决方案3】:

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

删除

spring-boot-devtools

依赖让我的生活更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多