【问题标题】:Using Drools drl file with common functions in 2 separate kbase/ksessions在 2 个单独的 kbase/ksessions 中使用具有常用功能的 Drools drl 文件
【发布时间】:2015-04-10 09:38:54
【问题描述】:

使用 Drools 6.2.0.Final 我们有一个规则项目,在 kmodule.xml 中配置了 2 个单独的 kbase 和 ksession:

<kbase name="kbase1"
      packages="foo.bar.package1">
    <ksession name="ksession1" type="stateless" />
</kbase>

<kbase name="kbase2"
        packages="foo.bar.package2">
  <ksession name="ksession2" type="stateless" />
</kbase>

在每个这些包中,我们都有许多包含一些业务规则的 .drl 文件。 除了这些之外,每个包都包含一个 .drl,其中包含从业务规则文件调用的函数,例如package1-functions.drl 和 package2-functions.drl。 由于这两个函数文件的内容是相同的,我们正在考虑创建一个“通用”包,并且只有一个函数文件的副本。

但是,我们还没有设法让我们的规则与位于单独包中的函数一起使用。

这就是我们配置 kmodule.xml 的方式:

<kbase name="common"
    packages="foo.bar.common"/>

<kbase name="kbase1" includes="common"
    packages="foo.bar.package1">
    <ksession name="ksession1" type="stateless" />
</kbase>

<kbase name="kbase2" includes="common"
       packages="foo.bar.package2">
    <ksession name="ksession2" type="stateless" />
</kbase>

我们尝试的另一种方法是不使用“通用”kbase,而是将通用包添加到 kbase1 和 kbase2 中的“packages”属性中。

是否可以在其他 2 个 kbase 中使用通用包?

【问题讨论】:

    标签: drools


    【解决方案1】:

    无法从另一个 DRL 包中使用 DRL 函数。

    可以在一个单独的 DRL 文件中包含一个或多个函数,并且它们可以在同一个 DRL 包中的任何 DRL 文件中使用。

    也许您高估了 DRL 包的重要性 - 如果所有 DRL 文件都在同一个 DRL 包中,您不会有任何问题。

    或者,考虑使用 Java 静态方法。

    【讨论】:

    • 感谢您的回复。根据我的研究,我已经预料到这是不可能的。在我们的案例中使用单独的包的原因是,我们为一个客户群制定了一套业务规则,而另一个客户群则针对我们想要单独处理的另一个客户群制定了另一套业务规则。我认为我们将把我们的函数代码放在一个 Java 类中。
    • 对于不同的“客户群”,您可能希望建立不同的知识库。包含规则的 DRL 文件会有所不同,包可以相同,功能的包也可以相同。然后,构建不同的知识库是一个配置管理的问题。 - 但是采用静态方法/Java 方式是一个不错的选择,尤其是在函数代码不随规则逻辑而变化的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多