Java中最流行的幾種業務規則引擎簡介

發表於2021-04-23

在本文中,我們將檢查Java中一些最受歡迎的規則引擎。規則引擎使將業務邏輯與原始碼分離變得容易。我們可能會將規則引擎視為複雜的if/then語句,在Java中,大多數流行的規則引擎都實現JSR94。

 

介紹

想象一下規則引擎是一個將資料和規則作為輸入的系統。它將這些規則應用於資料,並根據規則定義為我們提供輸出。讓我們以一個線上購物為例,我們希望為客戶提供某些促銷或折扣。

  • 如果購物車總額超過$ 400,可為客戶提供20%的折扣。
  • 第一次下單給10%。

上面將購物車和客戶定義為滿足規則集中定義的條件的規則將在其中執行的資料。

使用規則引擎有幾個優點:

  • 它提供了極大的靈活性,我們可以在不對原始碼進行重大更改的情況下更改規則。
  • 由於我們不再需要在原始碼中構建規則引擎邏輯,因此降低了複雜性。
  • 通過將規則引擎分開,它提供了更大的可重用性。

讓我們看一下Java中一些流行的規則引擎。

 

1.Drools

Drools是業務規則管理系統(BRMS)解決方案。它提供了核心業務規則引擎(BRE),Web創作和規則管理應用程式(Drools Workbench),對符合性級別3的決策模型和註釋(DMN)模型的完整執行時支援,以及用於核心開發的Eclipse IDE外掛。

 

2.EasyRule

EasyRule是輕量級的規則引擎API。它提供Rule抽象來建立帶有條件和動作的規則,以及RulesEngine通過一組規則執行以測試條件和執行動作的API。以下是EasyRule的一些核心功能:

  • 輕量級規則引擎API。
  • 基於註釋和POJO。
  • 支援複合規則構造。
  • 支援表達語言(如MVEL和SpEL)來定義規則。

讓我們概述一下Easy Rules API。加入依賴:

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>3.3.0</version>
</dependency>

Easy Rules 提供以下建立規則的選項

  • 宣告式地使用註釋。
  • 務實地使用流利的API。
  • 使用表達語言 
  • 使用規則描述符。

讓我們看幾個例子:

@Rule(name = "cart total rule", description = "Give 10% off when shopping cart is greater than $200" )
public class CartTotalRule {

    @Condition
    public boolean cartTotal(@Fact("cart") Cart cart) {
        return cart.isGreaterThanTwoHundered;
    }
    
    @Action
    public void giveDiscount(@Fact("cart") Cart cart) {
       cart.setTotalDiscount(200);
    }
}

規則引擎的最後一部分是基於事實和規則資料執行規則。

public class CartTotalRuleTest {
    public static void main(String args) {
        // define facts
        Facts facts = new Facts();
        facts.put("cart", get_customer_cart);

        // define rules
        Rule cartTotalRUle = CartTotalRule
        Rules rules = new Rules();
        rules.register(cartTotalRUle);

        // fire rules on known facts
        RulesEngine rulesEngine = new DefaultRulesEngine();
        rulesEngine.fire(rules, facts);
    }
}

 

3. RuleBook

RuleBook提供了靈活的簡單直觀的DSL。如果您有更多規則集,我們可以將其構建為帶註釋的POJO,並且RuleBook可以將整個包立即轉換為RuleBook。它提供了一個易於使用的啟用Lambda的領域特定語言或使用POJO,讓我們使用RuleBook來檢視一個簡單的規則定義:

要在您的專案中新增RuleBook,請在pom.xml檔案中新增以下依賴項:

<dependency>
    <groupId>com.deliveredtechnologies</groupId>
    <artifactId>rulebook-core</artifactId>
    <version>${version}</version>
</dependency>

讓我們看一個例子:

public class Cart{
    private double cartTotal;
    private String cartId;
    private Customer user;
    private List cartEntries;

    //getter and setter
}

public class ShoppingCartRule extends CoRRuleBook {

    @Override
    public void defineRules() {
     
        //give 10% off when cart total is greater than $200
      addRule(RuleBuilder.create().withFactType(Cart.class).withResultType(Double.class)
        .when(facts -> facts.getOne().getCartTotal() > 200)
        .then((facts, result) -> result.setValue(20))
        .stop()
        .build());
}

讓我們執行規則:

public class CartPromotionRule {
    public static void main(String args) {
      RuleBook cartPromotion = RuleBookBuilder.create(ShoppingCartRule.class).withResultType(Double.class)
        .withDefaultResult(0.0)
        .build();
      NameValueReferableMap facts = new FactMap();
      facts.setValue("cart", new Cart(450.0, 123456, customer, entries));
      cartPromotion.run(facts);
    }
}

 

4. OpenL平板電腦

OpenL Tablets業務規則引擎(BRE)和業務規則管理系統(BRMS)。它包含以下主要元件:

  • 業務規則引擎
  • 網路工作室
  • 網頁服務
  • 規則儲存庫(基於JCR的實現)

要新增依賴項,請將以下內容新增到pom.xml中:

<dependency>
    <groupId>org.openl</groupId>
    <artifactId>org.openl.core</artifactId>
    <version>${version}</version>
</dependency>
<dependency>
    <groupId>org.openl.rules</groupId>
    <artifactId>org.openl.rules</artifactId>
    <version>${version}</version>
</dependency>

使用程式碼:

public class Main {
    private CartPromotionRules instance;
 
    public static void main(String args) {
        Main rules = new Main();
        // setup user and case here
        rules.process(aCase);
    }
 
    public void process(Case aCase) {
        EngineFactory engineFactory = new RulesEngineFactory(
          getClass().getClassLoader()
            .getResource("rules.xls"), CartPromotionRules.class);
        instance = engineFactory.newEngineInstance();
        instance.executePromotion(aCase, new Response());
    }
}

注意

  1. Jess –一種類似於Clips的Rule引擎,可通過Java使用Common Lisp的全部功能進行訪問
  2.  JLisa –小型,輕便,快速的規則引擎和完全用Java編寫的指令碼環境;允許訪問所有Java API。

概括

在本文中,我們討論了Java中流行的規則引擎。這些規則引擎為業務邏輯抽象提供了靈活性。在所有這些規則引擎中,Drools是最先進,最活躍的規則引擎。

 

相關文章