根据某些条件加载特定规则文件

时间:2015-02-11 06:49:13

标签: drools

我是Drools的新手,所以如果我的问题非常基本,我会提前道歉。通常,如果我必须加载规则文件,我会这样做:

    KieServices kieServices = KieServices.Factory.get();
    KieContainer kContainer = kieServices.getKieClasspathContainer();
    kSession = kContainer.newStatelessKieSession();`

但是如何根据某些条件更改规则文件?假设我有3个实现接口(P)的类(A,B和C),并且我还有一个带有P类对象的函数(myFunction(P p){...})。

现在,根据传递给myFunction()的对象的类型,我需要加载不同的.drl文件。例如,a.drl if对象是A的实例,b.drl是B的实例。如何在drools 6中执行此操作?

1 个答案:

答案 0 :(得分:1)

我能想到的最简单的方法是创建多个知识库:

<kbase name="Kbase1" packages="rules.objectone">
    <ksession name="Kbase1Session" />
</kbase>
<kbase name="Kbase2" packages="rules.objecttwo">
    <ksession name="Kbase2Session" />
</kbase>

然后你可以编写如下方法:

KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();

public void process(Object1 obj) {
    kSession = kContainer.newStatelessKieSession("Kbase1Session");
    kSession.insert(obj);
    kSession.fireAllRules();
}
public void process(Object2 obj) {
    kSession = kContainer.newStatelessKieSession("Kbase2Session");
    kSession.insert(obj);
    kSession.fireAllRules();
}

即。为每种对象类型使用不同的会话。