Drools - 了解此示例,其中 drl 文件存储在与 kmodule 文件的 Kbase 名称属性不同的位置

Drools - Understanding this example with drl file stored in a different location than the Kbase name attribute of the kmodule file

我正在看这个例子,其中 KieBase 定义如下:

  <?xml version="1.0" encoding="UTF-8"?>
    <kmodule
        xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="kbase1">
        <ksession name="ksession1"/>
    </kbase>
 </kmodule>

我原以为 drl 文件会在 src/main/resources/kbase1 中。我做出这个假设是因为阅读了 Mastering JBoss Drools 6 这本书,它表明 kbase 名称是应该放置 drl 文件的位置。句子如下:

'Notice that the name attribute of the KieBase is the same as the directory structure that we are using under /src/test/resources/ directory, where the rules are stored. '

然而,在示例中,drl 文件位于以下目录中: src/main/resources/namedkiesession.

这是文件:HAL1.drl

  package org.drools.example.api.namedkiesession

   import org.drools.example.api.namedkiesession.Message

   global java.io.PrintStream out

   rule "rule 1" salience 10 when
    m : Message( )
   then
     out.println( m.getName() + ": " +  m.getText() );
   end

  rule "rule 2" when
     Message( text == "Hello, HAL. Do you read me, HAL?" )
  then
    insert( new Message("HAL", "Dave. I read you." ) );
  end

如果 KieBase 名称不是实际存储 drl 文件的位置,这将如何工作?完整的源代码在这里:

https://github.com/kiegroup/drools/blob/6.0.x/drools-examples-api/pom.xml

您刚刚在书中发现了一个错误(或拼写错误)。 KieBasename 是您随意选择的名称,与.drl 文件所在的目录结构无关。

<kbase> 元素的属性是 packages 属性,而不是 name 属性,如果 packages 属性未指定,则 KieBase 将包含位于 resource 目录下的任何工件(drl、bpmn、dtable 等)。

您可以在 the official Drools' documentation 中找到对 <kbase> 属性的更好解释(查找 table 4.1)。

请注意,从 7.18 版开始,packages 属性的语义发生了轻微(但基本)的变化,如 documentation.

中所述

希望对您有所帮助,