drools執行String規則或執行某個規則檔案

huan1993發表於2022-06-02

1、背景

此處主要記錄一下2個小的知識點,防止以後忘記。

1、如何在drools中執行某個drl檔案。
2、如果我們的規則是一個String型別的字串,那麼該如何執行。

2、實現

2.1 執行指定的drl檔案

KieHelper kieHelper = new KieHelper();
// 獲取指定的drl檔案
Resource resource = ResourceFactory.newClassPathResource("rules/alway-rule.drl", "UTF-8");
kieHelper.addResource(resource,ResourceType.DRL);
KieBase kieBase = kieHelper.build();
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
kieSession.dispose();

2.2 執行String規則

String drl = "package rules\n" +
                "\n" +
                "rule \"rule-01\"\n" +
                "    when\n" +
                "        $i: Integer()\n" +
                "    then \n" +
                "        System.out.println(\"規則:[\"+drools.getRule().getName()+\"]執行,規則記憶體中存在的值是:\"+$i);\n" +
                "end";


KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);
// 建立KieBase是一個成本很大的
KieBase kieBase = kieHelper.build(EqualityBehaviorOption.IDENTITY);
System.out.println(kieBase);
// 建立KieSession成本小

KieSession kieSession = kieBase.newKieSession();

kieSession.insert(123);
kieSession.fireAllRules();

kieBase.removeRule("rules", "rule-01");

kieSession.insert(456);
kieSession.fireAllRules();

kieSession.dispose();

需要注意的是KieBase的建立成本是很大的,因此如果真的要這樣用必要的快取是需要的。

3、完整程式碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-load-rule-from-string-or-file

相關文章