在2个单独的kbase/k会话中使用带有公共函数的Drools drl文件

在2个单独的kbase/k会话中使用带有公共函数的Drools drl文件,drools,Drools,使用Drools 6.2.0.Final,我们有一个规则项目,其中有两个单独的kbase和ksession,在kmodule.xml中配置如下: <kbase name="kbase1" packages="foo.bar.package1"> <ksession name="ksession1" type="stateless" /> </kbase> <kbase name="kbase2" packages="

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

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

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

然而,我们还没有设法使我们的规则与单独包中的函数一起工作

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

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


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


是否可以在其他两个kbase中使用公共包?

无法从另一个DRL包中使用DRL功能

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

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


备选,考虑使用java静态方法。

谢谢响应。从我的研究中,我已经预料到这是不可能的。在我们的案例中,有单独的包的原因是,我们有一套针对一个客户群体的业务规则,另一套针对另一个客户群体的业务规则,我们希望单独处理。我想我们会把我们的函数代码放在一个Java类中。对于不同的“客户群体”,你可能需要建立不同的知识库。包含规则的DRL文件将不同,包可以相同,函数包也可以相同。然后,构建不同的知识库是配置管理的问题。-但是,采用静态方法/Java是一个不错的选择,特别是如果函数代码不随规则逻辑而改变的话。