最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

drools中then部分的寫法(推薦)

 更新時(shí)間:2022年05月26日 10:11:07   作者:普通網(wǎng)友  
本文介紹一下drools中then部分的寫法,以及一些內(nèi)置的方法,比如insert/delete/modify等等。同時(shí)也介紹一下rule的繼承,和在when中實(shí)現(xiàn)if else if?等操作,感興趣的朋友跟隨小編一起看看吧

1、背景

此處介紹一下droolsthen部分的寫法,以及一些內(nèi)置的方法,比如insert/delete/modify等等。同時(shí)也介紹一下rule的繼承,和在when中實(shí)現(xiàn)if else if 等操作。

2、支持的方法

drools提供了一些內(nèi)置的方法,這些方法會修改drools的工作內(nèi)存Fact對象的值。從而會導(dǎo)致重新進(jìn)行模式匹配。

2.1 insert 插入對象到工作內(nèi)存中

insert是向工作內(nèi)存中插入對象,同時(shí)會導(dǎo)致重新進(jìn)行規(guī)則的模式匹配。同時(shí)當(dāng)規(guī)則不滿足時(shí),不會自動(dòng)刪除。

2.1.1 需求

當(dāng)發(fā)生火災(zāi)Fire時(shí),向工作內(nèi)存中插入一個(gè)Alarm對象,告警發(fā)生后,刪除工作內(nèi)存中的Fire對象,然后檢測Alarm對象是否還存在。

2.1.2 drl文件編寫

package rules
import com.huan.drools.insertmethod.Fire
import com.huan.drools.insertmethod.Alarm
rule "insert_發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象"
    when
        $fire: Fire()
    then
        System.out.println("1、發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象");
        insert(new Alarm($fire));
end
rule "insert_當(dāng)規(guī)則內(nèi)存中存在告警對象,進(jìn)行告警,然后刪除火災(zāi)對象"
    when
        $fire: Fire()
        $alarm: Alarm( fire == $fire )
    then
        System.out.println("2、進(jìn)行告警,然后刪除對應(yīng)的火災(zāi)對象");
end
rule "insert_檢測告警對象是否還是存在-01"
    when
        Alarm()
    then
        System.out.println("3、insert 插入的告警對象還存在");
        // 刪除工作內(nèi)存中的Fire對象
        delete($fire);
end
rule "insert_檢測告警對象不存在"
    when
        not Alarm()
    then
        System.out.println("3、insert 插入的告警對象不存在");
end

此處使用的是 insert進(jìn)行插入

2.1.3 部分java代碼編寫

// 將火災(zāi)對象插入到工作內(nèi)存中
kieSession.insert(new Fire());
// 只觸發(fā)規(guī)則名稱以 insert_ 開頭的規(guī)則
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insert_"));

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

1、發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象
2、進(jìn)行告警,然后刪除對應(yīng)的火災(zāi)對象
3、insert 插入的告警對象還存在

2.1.5 結(jié)論

  • insert可以向工作內(nèi)存中插入Fact對象。
  • insert方法調(diào)用后,會導(dǎo)致模式的重新匹配,導(dǎo)致之前不會執(zhí)行的規(guī)則,重新執(zhí)行。
  • insert方法插入到工作內(nèi)存的對象,在規(guī)則不成立時(shí),不會自動(dòng)刪除,需要手動(dòng)刪除,注意和insertLogical的區(qū)別

2.2 insertLogical 插入對象到工作內(nèi)存中

insert是向工作內(nèi)存中插入對象,同時(shí)會導(dǎo)致重新進(jìn)行規(guī)則的模式匹配。同時(shí)當(dāng)規(guī)則不滿足時(shí),會自動(dòng)刪除。

2.2.1 需求

當(dāng)發(fā)生火災(zāi)Fire時(shí),向工作內(nèi)存中插入一個(gè)Alarm對象,告警發(fā)生后,刪除工作內(nèi)存中的Fire對象,然后檢測Alarm對象是否還存在。

2.2.2 drl文件編寫

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "insertLogical_發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象"
    when
        $fire: Fire()
    then
        System.out.println("1、發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象");
        insertLogical(new Alarm($fire));
end
rule "insertLogical_當(dāng)規(guī)則內(nèi)存中存在告警對象,進(jìn)行告警,然后刪除火災(zāi)對象"
    when
        $fire: Fire()
        $alarm: Alarm( fire == $fire )
    then
        System.out.println("2、進(jìn)行告警,然后刪除對應(yīng)的火災(zāi)對象");
        delete($fire);
end
rule "insertLogical_檢測告警對象是否還是存在-01"
    when
        Alarm()
    then
        System.out.println("3、insertLogical 插入的告警對象還存在");
end
rule "insertLogical_檢測告警對象不存在"
    when
        not Alarm()
    then
        System.out.println("3、insertLogical 插入的告警對象不存在");
end

此處使用的是insertLogical插入

2.2.3 部分java代碼編寫

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insertLogical_"));

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

1、發(fā)生火災(zāi)時(shí),往工作內(nèi)存中插入告警對象
2、進(jìn)行告警,然后刪除對應(yīng)的火災(zāi)對象
3、insertLogical 插入的告警對象不存在

2.2.5 結(jié)論

  1. insertLogical可以向工作內(nèi)存中插入Fact對象。
  2. insertLogical方法調(diào)用后,會導(dǎo)致模式的重新匹配,導(dǎo)致之前不會執(zhí)行的規(guī)則,重新執(zhí)行。
  3. insertLogical方法插入到工作內(nèi)存的對象,在規(guī)則不成立時(shí),會自動(dòng)刪除注意和insert的區(qū)別

2.3、update 更新工作內(nèi)存中的對象

update: 使用它來指定要更新的字段和整個(gè)相關(guān)Fact,并將更改通知 Drools 引擎。 Fact發(fā)生更改后,您必須在更改可能受更新值影響的另一個(gè)事實(shí)之前調(diào)用 update。 為避免此添加步驟,請改用 modify 方法。

2.3.1 需求

規(guī)則一: 當(dāng)工作內(nèi)存中存在火災(zāi)對象Fire,并且名字name為空時(shí)觸發(fā)規(guī)則,同時(shí)在設(shè)置火災(zāi)的名字為大火災(zāi)。
規(guī)則二: 當(dāng)火災(zāi)存在名字時(shí),輸出火災(zāi)名字

2.3.2 drl 文件編寫

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "update_當(dāng)存在火災(zāi)對象時(shí),設(shè)置一個(gè)火災(zāi)的名字"
    when
        $fire: Fire(name == null)
    then
        System.out.println("1、設(shè)置火災(zāi)名字");
        $fire.setName("大火災(zāi)");
        update($fire)
end
rule "update_當(dāng)火災(zāi)對象存在名字時(shí)觸發(fā)"
    when
        $fire: Fire(name != null)
    then
        System.out.println("2、火災(zāi)對象的名字為: " + $fire.getName());
end

2.3.3 部分java文件編寫

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("update_"));

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

1、設(shè)置火災(zāi)名字
2、火災(zāi)對象的名字為: 大火災(zāi)

2.3.4 結(jié)論

  • update會導(dǎo)致模式的重新匹配。
  • update會修改工作對象內(nèi)存中的值。

2.4、modify 更新工作內(nèi)存中的對象

modify: 使用它來指定要為Fact對象修改的字段并將更改通知 Drools 引擎。 此方法提供了一種結(jié)構(gòu)化的事實(shí)更新方法。 它將更新操作與 setter 調(diào)用相結(jié)合以更改對象字段。

2.4.1 需求

規(guī)則一: 當(dāng)工作內(nèi)存中存在火災(zāi)對象Fire,并且名字name為空時(shí)觸發(fā)規(guī)則,同時(shí)在設(shè)置火災(zāi)的名字為大火災(zāi)。
規(guī)則二: 當(dāng)火災(zāi)存在名字時(shí),輸出火災(zāi)名字

2.4.2 drl 文件編寫

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "modify_當(dāng)存在火災(zāi)對象時(shí),設(shè)置一個(gè)火災(zāi)的名字"
    when
        $fire: Fire(name == null)
    then
        System.out.println("1、設(shè)置火災(zāi)名字");
        modify($fire){
            setName("大火災(zāi)")
        }
end
rule "modify_當(dāng)火災(zāi)對象存在名字時(shí)觸發(fā)"
    when
        $fire: Fire(name != null)
    then
        System.out.println("2、火災(zāi)對象的名字為: " + $fire.getName());
end

2.4.3 部分java文件編寫

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("modify_"));

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

  • 1、設(shè)置火災(zāi)名字
  • 2、火災(zāi)對象的名字為: 大火災(zāi)

2.4.5 結(jié)論

  • modify會導(dǎo)致模式的重新匹配。
  • modify會修改工作對象內(nèi)存中的值。一般情況下使用modify,不要使用update。

2.5 delete 刪除工作內(nèi)存中的對象

用法:delete(<object>)

retract也是和delete一樣的效果,但是推薦使用delete

3、drools變量的簡單使用

package rules
rule "drools_變量的使用"
    wh
        eval(true)
    then
        System.out.println("Match激活的當(dāng)前觸發(fā)規(guī)則: " + drools.getMatch());
        System.out.println("當(dāng)前觸發(fā)規(guī)則的名字: " + drools.getRule().getName());
        // System.out.println("終止規(guī)則執(zhí)行fireUntilHalt(): " + drools.getKieRuntime().halt());
        // System.out.println("激活A(yù)gendaGroup組: " + drools.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus());
        System.out.println("獲取所有全局變量: " + drools.getKieRuntime().getGlobals());
        // System.out.println("設(shè)置全局變量:" +  drools.getKieRuntime().setGlobal("username","huan"); );
        // System.out.println("獲取查詢結(jié)果:" + drools.getKieRuntime().getQueryResults());
end

4、規(guī)則的繼承

4.1 需求

規(guī)則一: 如果用戶(customer)的年齡(age)大于60歲,則打0.9折。
規(guī)則二: 在規(guī)則一的基礎(chǔ)上,如果用戶有車(car),則可以免費(fèi)停車(freeParking)。

4.2 drl文件編寫

package rules
import com.huan.drools.Customer
import com.huan.drools.Car
rule "rule_extends_規(guī)則一"
    when
        $c: Customer(age > 60)
    then
        modify($c){
            setDiscount(0.9)
        }
        System.out.println("觸發(fā)規(guī)則一:用戶年齡>60歲,打0.9折");
end
// 規(guī)則二繼承規(guī)則一的條件
rule "rule_extends_規(guī)則二" extends "rule_extends_規(guī)則一"
    when
        $car: Car()
    then
        modify($car){
            setFreeParking(true)
        }
        System.out.println("觸發(fā)規(guī)則二:用戶有車,免費(fèi)停車");
end

此處rule_extends_規(guī)則二繼承了rule_extends_規(guī)則一,所以規(guī)則一的條件也繼承了。

4.3 部分java代碼

Car car = new Car();
Customer customer = new Customer();
customer.setAge(65);
kieSession.insert(customer);
kieSession.insert(car);
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("rule_extends_"));

客戶有車,并且年齡是65歲,滿足上方的規(guī)則一和規(guī)則二

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

觸發(fā)規(guī)則一:用戶年齡>60歲,打0.9折
觸發(fā)規(guī)則二:用戶有車,免費(fèi)停車

4.5 結(jié)論

可以看到在rule上使用extends關(guān)鍵字,可以實(shí)現(xiàn)規(guī)則的繼承。

5、使用do[...]語法重寫上方繼承的例子

5.1 需求

只要用戶大于60歲,直接打0.9折,如果還有車,則可以免費(fèi)停車。

5.2 drl文件編寫

package rules
import com.huan.drools.Customer
import com.huan.drools.Car
rule "命名結(jié)果_rule"
    when
        $c: Customer(age > 60)
        do[giveDiscount] // 當(dāng)上方的條件成立時(shí)執(zhí)行 then [giveDiscount]
        $car: Car() // 此條件成立時(shí),執(zhí)行默認(rèn)的 then
    then
        modify($car){
            setFreeParking(true)
        };
        System.out.println("用戶有車,免費(fèi)停車");
    then [giveDiscount]
        modify($c){
            setDiscount(0.9)
        };
        System.out.println("用戶年齡>60歲,打0.9折");
end

解釋: 見上方的規(guī)則文件里的注視

5.3 部分java代碼編寫

Car car = new Car();
Customer customer = new Customer();
customer.setAge(65);
kieSession.insert(customer);
kieSession.insert(car);
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("命名結(jié)果_"));

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

用戶年齡>60歲,打0.9折
用戶有車,免費(fèi)停車

也實(shí)現(xiàn)了需求

5.5 結(jié)論

通過when中使用 do[名字] 然后 then then 名字 也可以實(shí)現(xiàn)。

6、實(shí)現(xiàn) if else if 的效果

6.1 需求

完成類似 if else if else效果。見下方的各種執(zhí)行結(jié)果

6.2 規(guī)則文件

rule "if else-if"
    when
       $customer: Customer(age > 60) // 規(guī)則內(nèi)存中存在Customer對象,并且age>60
        if($customer.getLevel() == 1) do[level1] // 用戶的級別是1,執(zhí)行then[level1],然后繼續(xù)執(zhí)行下方的條件
        else if ($customer.getLevel() == 2) break[level2] // 用戶的級別是2,執(zhí)行then[level2],不在執(zhí)行下方的條件
        else do[levelOther] // 其他的level級別,執(zhí)行then[levelOther],然后在執(zhí)行下方的條件
        Car()
    then
        System.out.println("我執(zhí)行了");
    then[level1]
        System.out.println("level1");
    then[level2]
        System.out.println("level2");
    then[levelOther]
        System.out.println("levelOther");
end

6.3 執(zhí)行結(jié)果圖

6.4 各種執(zhí)行結(jié)果-也就是上圖的解釋

1、Customerage小于60。
輸出: 沒有輸出。
2、Customerage大于60并且level=1,沒有Car
輸出: level1
3、Customerage大于60并且level=1,有Car。
輸出: level1 我執(zhí)行了
4、Customerage大于60并且level=2,沒有Car。
輸出: level2
5、Customerage大于60并且level=2,有Car。
輸出: level2
6、Customerage大于60并且level=3,沒有Car。
輸出: levelOther
7、Customerage大于60并且level=3,有Car。
輸出: levelOther 我執(zhí)行了

6.5 do和 break 有什么區(qū)別

do:執(zhí)行完之后,還會繼續(xù)判斷后面的執(zhí)行條件。 (即還會執(zhí)行后面的Car判斷,根據(jù)是否有Car獲取不同的結(jié)果
break:執(zhí)行完之后,不會在判斷后面的執(zhí)行條件。(即忽略了后面的Car判斷,rule執(zhí)行完了

7.完整代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-then

8.參考文檔

https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-rules-THEN-con_drl-rules

到此這篇關(guān)于drools中then部分的寫法的文章就介紹到這了,更多相關(guān)drools中then寫法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例

    Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)按中文首字母排序的具體實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • Java中IO流 RandomAccessFile類實(shí)例詳解

    Java中IO流 RandomAccessFile類實(shí)例詳解

    這篇文章主要介紹了Java中IO流 RandomAccessFile類實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java簡單冒泡排序示例解析

    Java簡單冒泡排序示例解析

    這篇文章主要介紹了Java簡單冒泡排序示例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 解決netty中spring對象注入失敗的問題

    解決netty中spring對象注入失敗的問題

    這篇文章主要介紹了解決netty中spring對象注入失敗的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析

    Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析

    這篇文章主要介紹了Springmvc數(shù)據(jù)回顯實(shí)現(xiàn)原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)現(xiàn)網(wǎng)頁爬蟲的示例講解

    java實(shí)現(xiàn)網(wǎng)頁爬蟲的示例講解

    下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)網(wǎng)頁爬蟲的示例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • java ExecutorService使用方法詳解

    java ExecutorService使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了java ExecutorService使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JVM知識總結(jié)之垃圾收集算法

    JVM知識總結(jié)之垃圾收集算法

    本博客為讀書筆記,讀的是《深入理解Java虛擬機(jī)》一書,在看這個(gè)書的時(shí)候,最大的一個(gè)感受便是“當(dāng)初怎么就沒有好好學(xué)習(xí)操作系統(tǒng)呢,不然也不會有這么多看的云里霧里的地方了”,不過那都是過去的事了,學(xué)習(xí)最好的時(shí)刻便是現(xiàn)在,需要的朋友可以參考下
    2021-06-06
  • java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)

    java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)

    這篇文章主要為大家詳細(xì)介紹了java使用鏈表實(shí)現(xiàn)約瑟夫環(huán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 基于MapperXML掃描的問題

    基于MapperXML掃描的問題

    這篇文章主要介紹了MapperXML掃描的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

彝良县| 江油市| 荔波县| 神池县| 阳原县| 霍城县| 博白县| 龙州县| 竹溪县| 冕宁县| 邵东县| 八宿县| 泾阳县| 英德市| 宜春市| 阳城县| 苍梧县| 筠连县| 中西区| 浦城县| 丽江市| 资中县| 前郭尔| 江永县| 九寨沟县| 嘉兴市| 阿勒泰市| 铜川市| 龙井市| 新兴县| 德化县| 军事| 正阳县| 平罗县| 尼玛县| 麻江县| 扬州市| 厦门市| 民权县| 亚东县| 滨州市|