【问题标题】:Drools - Execute Specific Rules from Kie Container based on a parameterDrools - 根据参数从 Kie Container 执行特定规则
【发布时间】:2017-12-02 07:28:25
【问题描述】:

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

【问题讨论】:

    标签: java drools rule-engine business-rules drools-kie-server


    【解决方案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();
    

    【讨论】:

    • 有没有办法执行一个特定的规则,尤其是当我们有多个规则和不同包的许多规则文件时?
    • 从执行子例程的意义上说,规则不能被“执行”。任何规则在满足其条件时都会被触发。
    • 但是我们找到了 AgendaFilter 接口来过滤要触发的特定规则
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2019-06-25
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多