Drools-基于参数从KIE容器中执行特定规则



我正在研究一个项目,在该项目中我们处理不同的文件,对于每个不同的文件,我们需要运行一些从数据库中获取的特定规则。现在,如果我们编译文件的每一行规则,则需要大量时间,因此性能问题。因此,我们所做的是,我们正在编译应用程序启动的所有规则,并创建KieconTainer。但是,我不知道如何根据文件ID执行特定文件规则。你能帮忙吗?

例如,我有2个具有ID 1和2的文件。我有10个规则,其中5个用于文件1,其余5个用于文件2。

使用以下代码,它在两个文件上启动了所有10个规则。

这是我的示例代码:

@Bean
public KieContainer kieContainer() throws IOException {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    // To get rules from DB
    List<String> rules = loadRules();
    int i=0;
    for (String file : rules) {
        kieFileSystem.write("src/main/resources/rules/" + "a"+i+".drl", kieServices.getResources().newReaderResource(new StringReader(file)));
        i++;
    }
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    KieModule kieModule = kieBuilder.getKieModule();
    return kieServices.newKieContainer(kieModule.getReleaseId());
}

//当我执行规则

KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(myObject);
kieSession.fireAllRules();
kieSession.dispose();

将您的规则细分为议程:

agenda-group "a"  // or add this to each rule a1, a2,...
rule a1 ...
rule a2 ...
agenda-group "b"
rule b1 ...
rule b2 ...

在呼叫火车之前,您需要决定要使用哪个组并设置焦点:

String group = ...;
kieSession.getAgenda().getAgendaGroup( group ).setFocus(); 
kieSession.insert(myObject);
kieSession.fireAllRules();

相关内容

  • 没有找到相关文章

最新更新