我正在使用带有Java 1.8.0_162的Drools 6.5.0,并且所有内容都适用于单个决策表(电子表格),请参阅下面的代码:
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession ks = kc.newKieSession("ksession-dtables"); //stateful knowledge session
FactHandle fh = ks.insert(fact);
ks.fireAllRules();
...
如何动态地,顺序地加载和执行多个决策表的规则?
换句话说,加载决策表#1并根据事实(数据)执行其规则,当完成加载决策表#2并执行其对事实(数据)的规则时,完成加载决策表#3并执行它的规则反对事实(数据)等,直到完成所有决策表的处理。动态,将所有决策表放在drools进程可以获取和处理的类路径中的相同位置(文件夹)中。
欢迎任何建议。
谢谢!
答案 0 :(得分:0)
您可以使用规则流程图进行操作。添加jBPM插件并编写规则流程图。添加ks.startprocess(“ processId”);在fireAllRules()之前。
注意:processId是规则流程图的进程ID。
答案 1 :(得分:0)
我也遇到过类似的情况,但是我没有使用决策表,而是使用了规则的drl文件。 因此,首先,如果您希望将所有规则都运行一次,那么请使用无状态的kie-session而不是有状态的。
StatelessKieSession session = null;
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
session = kContainer.newStatelessKieSession("sessionIdentifier");
一旦运行此会话中的规则,事实对象就会更新,您可以使用不同的sessionidentifier处理下一组规则。
无状态会话比有状态会话具有更大的性能优势。更多喜欢使用和抛出。
运行所有规则文件(决策表)可以通过遍历kmodule.xml中注册的所有会话标识符来完成
现在,在这种情况下,规则文件保存在资源文件夹中。
但是,如果要从文件系统加载它们,那也是可以实现的。