溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Drools規(guī)則引擎的簡單使用

發(fā)布時(shí)間:2021-09-10 11:02:56 來源:億速云 閱讀:160 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Drools規(guī)則引擎的簡單使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!


簡單使用

一個(gè)給不同商品設(shè)置不同折扣的例子
pom.xml

<dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>7.23.0.Final</version>
</dependency>

kmodule.xml 文件用于配置規(guī)則腳本,可以有多個(gè)kbase
文件放在項(xiàng)目resources/META-INF目錄下可以自動(dòng)加載

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rule"/>
    </kbase>
</kmodule>

Product Bean實(shí)體

//lombok注解
@Data
public class Product {
    public static final String DIAMOND = "DIAMOND";

    public static final String GOLD = "GOLD";

    private String type;

    private int discount;
}

resources/rules/Rules.drl 規(guī)則腳本

package rules

import drools.Product

//當(dāng)商品類型是DIAMOND時(shí),打折為15%
rule Offer4Diamond
    when
        productObject:Product(type == Product.DIAMOND)
    then
        productObject.setDiscount(15);
    end

//當(dāng)商品類型是GOLD時(shí),打折為25%
rule Offer4Gold
    when
        productObject: Product(type == Product.GOLD)
    then
        productObject.setDiscount(25);
    end

junit Test

    @Test
    public void droolsTest() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        KieSession kSession = kieContainer.newKieSession("ksession-rule");

        Product product = new Product();
        product.setType(Product.GOLD);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "條規(guī)則");
        System.out.println("商品" + product.getType() + "的商品折扣為" + product.getDiscount() + "%");
    }

運(yùn)行結(jié)果

命中了1條規(guī)則
商品GOLD的商品折扣為25%

解釋一下

kmodule.xml

  • 該文件用來配置規(guī)則表,可以包含多個(gè)kbase,每個(gè)kbase都有name屬性,不能重復(fù)

  • kbase可以包含多個(gè)ksession, packages屬性是src/main/resources目錄下文件夾的包路徑,可以定義多個(gè)包,逗號(hào)分隔,packages目錄下的所有規(guī)則文件都會(huì)被加載,除了子目錄

  • ksession 的name不能重復(fù),Java代碼中KieSession設(shè)置的name就是該配置的name

droolsTest

  • KieServices 
    該接口提供了很多方法,可以通過這些方法訪問KIE關(guān)于構(gòu)建和運(yùn)行的相關(guān)對象,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等信息;可以獲取KieRepository對象,利用KieRepository來管理KieModule等。 
    KieServices就是一個(gè)中心,通過它來獲取的各種對象來完成規(guī)則構(gòu)建、管理和執(zhí)行等操作。

  • KieContainer
    KieContainer可以理解為是一個(gè)KieBase的容器。

  • KieBase 
    KieBase可以理解為是一個(gè)知識(shí)倉庫,包含了若干的規(guī)則、流程、方法等,在Drools中主要就是規(guī)則和方法,KieBase本身并不包含運(yùn)行時(shí)的數(shù)據(jù)之類的,如果需要執(zhí)行規(guī)則KieBase中的規(guī)則的話,就需要根據(jù)KieBase創(chuàng)建KieSession。

  • KieSession
    KieSession就是一個(gè)跟Drools引擎打交道的會(huì)話,其基于KieBase創(chuàng)建,它會(huì)包含運(yùn)行時(shí)數(shù)據(jù),包含“事實(shí) Fact”,并對運(yùn)行時(shí)數(shù)據(jù)事實(shí)進(jìn)行規(guī)則運(yùn)算。我們通過KieContainer創(chuàng)建KieSession是一種較為方便的做法,其實(shí)他本質(zhì)上是從KieBase中創(chuàng)建出來

動(dòng)態(tài)規(guī)則

實(shí)現(xiàn)動(dòng)態(tài)規(guī)則有這幾種思路

     1. 使用Workbench,通過Web管理頁面動(dòng)態(tài)生成配置規(guī)則

     2. 將規(guī)則以字符串的形式存入數(shù)據(jù)庫,需要自己開發(fā)一套規(guī)則管理系統(tǒng)

使用Wrokbench

1.docker部署workbench

workbench
docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:7.5.0.Final 
kie-server
docker run -p 8180:8180 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:7.5.0.Final

訪問http://ip地址:8080/drools-wb 
默認(rèn)賬號(hào)/密碼 admin/admin

Drools規(guī)則引擎的簡單使用

2.創(chuàng)建項(xiàng)目

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用

3.創(chuàng)建Object

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用

4.創(chuàng)建DRL文件

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用

5.部署

Drools規(guī)則引擎的簡單使用

6.使用部署的規(guī)則文件

遠(yuǎn)程規(guī)則Maven倉庫地址獲取

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用


本地Maven倉庫settings.xml配置,這里只摘錄了需要添加的3處,需要對應(yīng)去添加

<server>
      <username>admin</username>
      <password>admin</password>
      <id>guvnor-m2-repo</id>
</server>

<profile>
  <id>guvnor-m2-repo</id> 
  <repositories>
    <repository>
      <id>guvnor-m2-repo</id>
      <name>Guvnor M2 Repo</name> 
      <url>http://10.211.55.7:8080/drools-wb/maven2/</url>
      <layout>default</layout> 
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> 
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> <!--更新策略,常常 --> 
      </snapshots>
    </repository> 
  </repositories>
  <activation> 
    <activeByDefault>true</activeByDefault>
  </activation>
</profile>

<activeProfiles>
    <activeProfile>guvnor-m2-repo</activeProfile>
</activeProfiles>

創(chuàng)建一個(gè)標(biāo)準(zhǔn)的SpringBoot工程

Product實(shí)體,包路徑要跟規(guī)則文件中的一致

@Data
public class Product {
    private String type;

    private int discount;
}

DroolsController.java

@RestController
@RequestMapping("/api/")
@Slf4j
public class DroolsController {

    @PostMapping("getdiscount")
    public Product getDiscount(Product product) throws IOException {
        KieServices ks = KieServices.Factory.get();
        //RELEASE 代表使用jar包的最新正式版
        ReleaseIdImpl releaseId = new ReleaseIdImpl("com.myteam", "test", "RELEASE");
        KieContainer kieContainer = ks.newKieContainer(releaseId);
        //自動(dòng)掃描Maven倉庫,有新版本會(huì)自動(dòng)下載
        KieScanner kieScanner = ks.newKieScanner(kieContainer);
        kieScanner.start(3000);
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.insert(product);
        int count = kieSession.fireAllRules();

        log.info("共執(zhí)行了{(lán)}條規(guī)則", count);
        log.info("商品{}的折扣為{}%", product.getType(), 
        product.getDiscount());
        return product;
    }
}

PostMan訪問接口

Drools規(guī)則引擎的簡單使用
與DRL規(guī)則文件中配置的一致

7.動(dòng)態(tài)規(guī)則

修改ppdrl.drl規(guī)則表,修改GOLD的打折為50%,保存規(guī)則,將項(xiàng)目版本提高一個(gè)版本,并build&deploy項(xiàng)目

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用

Drools規(guī)則引擎的簡單使用
再次訪問接口,GOLD的折扣已經(jīng)變?yōu)?0%,其中沒有重啟服務(wù)

Drools規(guī)則引擎的簡單使用

“Drools規(guī)則引擎的簡單使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI