我是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中执行此操作?
答案 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();
}
即。为每种对象类型使用不同的会话。