Drools 流口水和我的事实不符

Drools 流口水和我的事实不符,drools,kie,spring-boot-devtools,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 及 当我插入一个新的com.mgaudi

我是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

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

com.mgaudin.sandbox.drools.models.Lead
因此,我们可以推断:

  • 规则汇编得很好
  • 规则被执行了
  • 第一条规则与类型为“com.mgaudin.sandbox.drools.models.Lead”的事实相匹配
  • 那么为什么规则“规则2”不匹配呢


    谢谢

    好的,我找到了答案,它与Drools无关,它与Spring boot开发工具有关

    我不知道确切的机制,但要实现快速热重新加载(即使方法签名发生了变化),spring boot开发工具必须与JVM发生冲突,并代理一些对象,在我的例子中,这是事实。由于这一点以及Drools匹配事实的方式,该规则并没有触发


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

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

    我不知道确切的机制,但要实现快速热重新加载(即使方法签名发生了变化),spring boot开发工具必须与JVM发生冲突,并代理一些对象,在我的例子中,这是事实。由于这一点以及Drools匹配事实的方式,该规则并没有触发


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

    规则不匹配,因为您的fact(Lead)加载了不同的类加载器,所以Drools看不到它。这由devtools完成,如下所述:

    但是没有必要禁用devtools,只需将以下行添加到META-INF/spring-devtools.properties,正如所暗示的那样:
    
    重新启动.include.drools=/drools-[\\s\\s]+\.jar
    重新启动。include.kie=/kie-[\\s\\s]+\.jar
    

    因此Drools与Restart Classloader一起加载-与您的类相同。

    规则不匹配,因为您的事实(线索)与不同的Classloader一起加载,所以Drools看不到它。这由devtools完成,如下所述:

    但是没有必要禁用devtools,只需将以下行添加到META-INF/spring-devtools.properties,正如所暗示的那样:
    
    重新启动.include.drools=/drools-[\\s\\s]+\.jar
    重新启动。include.kie=/kie-[\\s\\s]+\.jar
    

    因此,Drools是用Restart Classloader加载的,与您的类一样。

    我遇到了一个问题,即插入的事实在规则中永远无法识别,但对全局变量没有问题

    移除

    弹簧靴开发工具


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

    我遇到了一个问题,即插入的事实在规则中永远无法识别,但在全局性方面没有问题

    移除

    弹簧靴开发工具


    依赖性让我的生活变得更轻松。

    这是否意味着你似乎有两个.DRL文件?都编译成一个单一的基库吗?怎么用?您验证过其中有两条规则吗?它们都被编译到同一个基库中(第一条规则只是为了证明我的drools运行正常并显示事实类名)。我尝试使用KieFileSystem/KieBuilder或KnowledgeBuilder编译规则。两者都编译得很好,但结果相同。另外,为了确保使用了我的DRL文件,我尝试用eval(true)修改同一个文件,该文件输出“这是一个匹配!”。如果您的故事中没有隐藏的障碍,那么我会说这是一个bug。制作一个完整的示例(最少Java、DRL),说明Drools版本并提出JIRA。-如果你编辑你的问题,添加所有这些代码和信息,我会调查它。这是否意味着你似乎有两个.DRL文件?都编译成一个单一的基库吗?怎么用?您验证过其中有两条规则吗?它们都被编译到同一个基库中(第一条规则只是为了证明我的drools运行正常并显示事实类名)。我尝试使用KieFileSystem/KieBuilder或KnowledgeBuilder编译规则。两者都编译得很好,但结果相同。另外,为了确保使用了我的DRL文件,我尝试用eval(true)修改同一个文件,该文件输出“这是一个匹配!”。如果您的故事中没有隐藏的障碍,那么我会说这是一个bug。制作一个完整的示例(最少Java、DRL),说明Drools版本并提出JIRA。-如果编辑问题,添加所有代码和信息,我会调查的。我可以确认我在使用这些相同的工具时遇到了相同的问题,并且删除了spring boot devtools修复了该问题。我们面临着相同的问题,通过删除
    spring boot devtools
    解决了该问题。当我们试图从spring boot应用程序中将此规则作为kjar读取时,出现了该问题。能够理解我们应该维护相同的包结构,以便在条件出现时在规则中正确加载和识别事实。我可以确认我使用这些相同的工具时遇到了相同的问题,并且删除spring boot devtools修复了该问题。我们面临相同的问题,并通过删除spring boot devtools来修复当我们试图从spring boot应用程序中以kjar的形式读取这些规则时,出现了这个问题。能够理解我们应该保持相同的包结构,以便在条件满足时在规则中正确加载和识别事实。这将只在RestartClassLoader中保留drools和kie jar,而不是事实和自定义类。不能保证使用它可以解决问题。这只会在RestartClassLoader中保留drools和kie jars,而不会保留事实和自定义类。不能保证使用此选项可以解决问题。
    com.mgaudin.sandbox.drools.models.Lead