Evrete 規則引擎簡介 | baeldung

banq發表於2021-10-21

本文提供了 Evrete(一種新的開源 Java 規則引擎)的首次實踐概述。
從歷史上看,Evrete被開發為Drools 規則引擎的輕量級替代品 。它完全符合Java 規則引擎規範,並使用經典的前向鏈 RETE 演算法和一些調整和功能來處理大量資料。
它需要 Java 8 及更高版本,零依賴,無縫操作 JSON 和 XML 物件,並允許功能介面作為規則的條件和操作。
它的大部分元件都可以透過服務提供者介面進行擴充套件,這些 SPI 實現之一將帶註釋的 Java 類轉換為可執行的規則集。我們今天也將嘗試一下。

<dependency>
    <groupId>org.evrete</groupId>
    <artifactId>evrete-core</artifactId>
    <version>2.1.04</version>
</dependency>


要兩個規則來處理資料:
  • 第一條規則清除每個客戶的總銷售額
  • 第二個規則匹配發票和客戶並更新每個客戶的總數。

使用流暢的介面宣告我們的兩個規則:

KnowledgeService service = new KnowledgeService();
Knowledge knowledge = service
  .newKnowledge()
  .newRule("Clear total sales")
  .forEach("$c", Customer.class)
  .execute(ctx -> {
      Customer c = ctx.get("$c");
      c.setTotal(0.0);
  })
  .newRule("Compute totals")
  .forEach(
      "$c", Customer.class,
      "$i", Invoice.class
  )
  .where("$i.customer == $c")
  .execute(ctx -> {
      Customer c = ctx.get("$c");
      Invoice i = ctx.get("$i");
      c.addToTotal(i.getAmount());
  });

熟悉 Drools 規則引擎的人會發現我們的規則宣告在語義上等同於相同邏輯的以下DRL版本:

rule "Clear total sales"
  when
    $c: Customer
  then
    $c.setTotal(0.0);
end

rule "Compute totals"
  when
    $c: Customer
    $i: Invoice(customer == $c)
  then
    $c.addToTotal($i.getAmount());
end


Evrete的註釋版本

<dependency>
    <groupId>org.evrete</groupId>
    <artifactId>evrete-dsl-java</artifactId>
    <version>2.1.04</version>
</dependency>


使用註釋建立與上面相同的規則集:

public class SalesRuleset {

    @Rule
    public void rule1(Customer $c) {
        $c.setTotal(0.0);
    }

    @Rule
    @Where("$i.customer == $c")
    public void rule2(Customer $c, Invoice $i) {
        $c.addToTotal($i.getAmount());
    }
}


然後我們告訴引擎從外部位置讀取我們的規則集定義:

KnowledgeService service = new KnowledgeService();
URL rulesetUrl = new URL("ruleset.java"); // or file.toURI().toURL(), etc
Knowledge knowledge = service.newKnowledge(
  "JAVA-SOURCE",
  rulesetUrl
);


每當建立新會話時,引擎會將其與帶註釋的規則類的新例項耦合。本質上,我們可以將這些類的例項視為會話本身。
因此,如果定義了類變數,則規則方法可以訪問這些變數。
如果我們定義條件方法或將新欄位宣告為方法,這些方法也可以訪問類變數。
作為常規 Java 類,此類規則集可以擴充套件、重用和打包到庫中。
 
官方文件位於https://www.evrete.org/docs/
程式碼示例和單元測試可在 GitHub 上獲得

相關文章