Droolsエントリーケース(3/6)

1.ビジネスシナリオの説明

ビジネスシナリオ:消費者は書店で本を購入し、注文後、支払いページに注文の割引価格を表示する必要があります。具体的な優先ルールは次のとおりです。

上記のルールに従って割引価格を計算する必要があります

2.開発と実現

最初のステップ:mavenプロジェクトdrools_quickstartを作成し、drools関連のmaven座標をインポートします

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

ステップ2:droolsの要件に従ってresource / META-INF /kmodule.xml構成ファイルを作成します

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <!--
        name:指定kbase的名称,可以任意,但是需要唯一
        packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
        default:指定当前kbase是否为默认
    -->
    <kbase name="myKbase1" packages="rules" default="true">
        <!--
            name:指定ksession名称,可以任意,但是需要唯一
            default:指定当前session是否为默认
        -->
        <ksession name="ksession-rule" default="true"/>
    </kbase>
</kmodule>

注:上記の構成ファイルの名前と場所は固定されており、変更できません。

手順3:エンティティクラスOrderを作成する

package com.itheima.drools.entity;
/**
 * 订单
 */
public class Order {
    private Double originalPrice;//订单原始价格,即优惠前价格
    private Double realPrice;//订单真实价格,即优惠后价格
    public String toString() {
        return "Order{" +
                "originalPrice=" + originalPrice +
                ", realPrice=" + realPrice +
                '}';
    }
    public Double getOriginalPrice() {
        return originalPrice;
    }
    public void setOriginalPrice(Double originalPrice) {
        this.originalPrice = originalPrice;
    }
    public Double getRealPrice() {
        return realPrice;
    }
    public void setRealPrice(Double realPrice) {
        this.realPrice = realPrice;
    }
}

ステップ4:ルールファイルresources / rules /bookDiscount.drlを作成します

//图书优惠规则
package book.discount
import com.jiusen.Order

//规则一:所购图书总价在100元以下的没有优惠
rule "book_discount_1"
    when
        $order:Order(originalPrice < 100)
    then
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end

//规则二:所购图书总价在100到200元的优惠20元
rule "book_discount_2"
    when
        $order:Order(originalPrice < 200 && originalPrice >= 100)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

//规则三:所购图书总价在200到300元的优惠50元
rule "book_discount_3"
    when
        $order:Order(originalPrice <= 300 && originalPrice >= 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
end

//规则四:所购图书总价在300元以上的优惠100元
rule "book_discount_4"
    when
        $order:Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
end

ステップ5:ユニットテストを作成する

package com.itheima.test;

import com.jiusen.drools.entity.Order;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DroolsTest
{
    @Test
    public void test1()
    {
        KieServices kieServices = KieServices.Factory.get();
        //获得Kie容器对象
        //默认自动加载 META-INF/kmodule.xml
        //从KieServices中获得KieContainer实例,其会加载kmodule.xml文件并load规则文件
        KieContainer kieContainer = kieServices.newKieClasspathContainer();
        //从Kie容器对象中获取会话对象
        KieSession session = kieContainer.newKieSession();

        //Fact对象,事实对象
        Order order = new Order();
        order.setOriginalPrice(500d);

        //将order对象插入到规则内存中
        session.insert(order);

        //激活规则,由Drools框架自动进行规则匹配,如果规则匹配成功,则执行当前规则
        int count = session.fireAllRules();
        System.out.println(count);

        //关闭会话
        session.dispose();

        System.out.println("优惠后的价格: " + order.getRealPrice());
    }
}

    

前述のように、ルールエンジンを使用すると、ビジネスルールを動的に管理できます。ビジネス担当者は、ビジネスルールのクエリ、追加、更新、カウント、更新、送信など、データ管理などのビジネスルールを管理できます。このようにして、サービスを再起動せずにビジネスルールを調整できます。

3.ルールエンジンの構造

droolsルールエンジンは、次の3つの部分で構成されています。

  • 作業メモリー
  • ルールベース
  • 推論エンジン

その中で、推論エンジン(推論エンジン)には次のものが含まれます。

  • パターンマッチャー(マッチャー)
  • アジェンダ(アジェンダ)
  • 実行エンジン

示されているように:

4.関連する概念の説明

作業メモリー[作業メモリー]:droolsルールエンジンは、作業メモリーからデータを取得し、ルールファイルで定義されたルールとパターンを一致させるため、開発するアプリケーションは、データを作業メモリーに挿入するだけで済みます。

ファクト[ファクト]:droolsルールの適用を指します。通常のJavaBeanを作業メモリーに挿入した後のオブジェクトはファクトオブジェクトです。

ルールベース[ルールベース]:ルールファイルで定義したルールがルールベースに読み込まれます。

パターンマッチャー[マッチャー]:ルールベースのすべてのルールを作業メモリー内のファクトオブジェクトと照合します。正常に照合されたルールがアクティブ化され、アジェンダに配置されます。

アジェンダ[アジェンダ]:マッチャーによるパターンマッチング後にアクティブ化されるルールを格納するために使用されます。

実行エンジン[実行エンジン]:アジェンダでアクティブ化されたルールを実行します。

5.ルールエンジンの実行プロセス

6.KIEの紹介

Droolsを操作するときによく使用するAPIとそれらの関係は次のとおりです。

上記のコアAPIを通じて、ほとんどのクラス名がKieで始まることがわかります。KieのフルネームはKnowledgeIS Everythingで、これは「Just Everything」の略で、一連のJBossプロジェクトの一般的な名前です。次の図に示すように、Kieの主なモジュールは、OptaPlanner、Drools、UberFire、およびjBPMです。

おすすめ

転載: blog.csdn.net/gjs935219/article/details/107801875