Drools與動態載入規則檔案

郭慕荣發表於2024-11-23

Drools簡介
Drools是一款基於Java的開源規則引擎,將規則與業務程式碼解耦。規則以指令碼的形式儲存在一個檔案中,使規則的變化不需要修改程式碼,重新啟動機器即可線上上環境中生效。
規則引擎實現了業務決策從應用程式程式碼中分離出來,並使用預定義的語義模組編寫業務決策。接受資料輸入、解釋業務規則,以及基於業務規則做出業務決策,從而提供極大的程式設計便利。
對系統使用人員來說:

  • 將業務規則的建立、修改、維護透明話;
  • 提高業務靈活度;
  • 減少對開發人員的依賴;
  • 避免業務升級帶來的風險

對開發人員來說:

  • 增加程式碼靈活性;
  • 降低系統維護成本,提高系統可維護性;
  • 解耦業務與規則,減少程式碼修改成本;
  • 簡化系統架構,最佳化應用結構;

Drools架構圖

快速開始
1. Maven匯入

  <drools.version>7.23.0.Final</drools.version>
<lombok.version>1.18.2</lombok.version>

<dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-client</artifactId>
        <version>${drools.version}</version>
</dependency>

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-compiler</artifactId>
  <version>${drools.version}</version>
</dependency>

2.Java整合
框架: spring-boot 、Lombok

@Data
public class Person {
private String name;
private int age;
}

3.drl檔案的編寫,resources下建立rules目錄,並編寫

import  com.mkun.drools.bean.Person;  //匯入對應bean [?*]
dialect  "mvel"

rule "drools-test"
when
     $person: Person(age < 16 || age > 50)
then
     System.out.println("該人員年齡不符合規則");
end

在對應路徑新增Kie檔案,resources下建立META-INF資料夾,並且建立檔案kmodule.xml

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>

4.編寫Test測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

private static KieContainer container = null;
private KieSession statefulKieSession = null;


@Test
public void contextLoads() {
    KieServices services = KieServices.Factory.get();
    container = services.getKieClasspathContainer();
    statefulKieSession = container.newKieSession("all-rules");
    Person person = new Person();
    person.setAge(15);
    person.setName("Drools");

    statefulKieSession.insert(person);
    statefulKieSession.fireAllRules();
    statefulKieSession.dispose();
}
}

5.動態載入規則

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

private static KieContainer container = null;
private KieSession statefulKieSession = null;


@Test
public void contextLoads() {
    String myRule = "import com.asiainfo.bean.Person\n" +
            "\n" +
            "dialect  \"mvel\"\n" +
            "\n" +
            "rule \"age\"\n" +
            "    when\n" +
            "        $person : Person(age<16 || age>50)\n" +
            "    then\n" +
            "        System.out.println(\"這個人的年齡不符合要求!(基於動態載入)\");\n" +
            "end\n";
    KieHelper helper = new KieHelper();
    helper.addContent(myRule, ResourceType.DRL);
    KieSession ksession = helper.build().newKieSession();
    Person person = new Person();
    person.setAge(12);
    person.setName("Test");
    ksession.insert(person);
    ksession.fireAllRules();
    ksession.dispose();

}
}

上述測試說明Drools可以基於字串配置規則,那麼我們在開發時就可以將自己配置的規則存到資料庫等儲存介質中,實時呼叫動態載入配置規則。

彙總:Drools動態載入規則,可以把規則儲存至資料庫中,然後動態載入規則生成drl檔案

相關文章