1

我正在处理一个项目,我们处理不同的文件,对于每个不同的文件,我们需要运行一些从数据库中获取的特定规则。现在,如果我们为文件的每一行编译规则,会花费大量时间,从而导致性能问题。所以,我们所做的是,我们正在编译我的应用程序启动时的所有规则并创建 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();
4

1 回答 1

1

将您的规则细分为议程组:

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

在调用 fireAllRules 之前,您需要决定使用哪个组并设置焦点:

String group = ...;
kieSession.getAgenda().getAgendaGroup( group ).setFocus(); 
kieSession.insert(myObject);
kieSession.fireAllRules();
于 2017-12-02T09:47:52.917 回答