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

drools中query的用法小結(jié)

 更新時間:2022年05月17日 09:15:27   作者:huan1993  
這篇文章主要介紹了drools中query的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、背景

我們知道在drools中是存在工作內(nèi)存的,我們的Fact對象會加入到工作內(nèi)存中,同時我們自己也可以在drl文件中使用insert/modify/update/delete等方法,修改工作內(nèi)存中對象的,那么我們怎么查詢修改之后的工作內(nèi)存的值呢?而droolsquery可以幫助我們實現(xiàn)這個功能。

二、需求

1、無參數(shù)query的使用
2、有參數(shù)query的使用
3、java代碼中openLiveQuery的使用
4、rule中使用query

三、前置需求

1、query的語法結(jié)構(gòu)

query queryName(參數(shù)列表)
end

注意事項:

query的名字在同一個KIE base的所有包中必須要唯一,一般情況下我們?nèi)治ㄒ患纯伞?code>query沒有whenthen的部分

2、java中如何獲取query的結(jié)果

1、通過getQueryResults獲取

QueryResults queryResults = kieSession.getQueryResults("query的名字",可選參數(shù)類表);

通過這種方式getQueryResults獲取到的結(jié)果只會獲取一次,如果工作內(nèi)存中的數(shù)據(jù)發(fā)生了變化,則不會自動感知到。

2、通過openLiveQuery獲取

kieSession.openLiveQuery("query的名字", new Object[]{可選參數(shù)}, new ViewChangedEventListener() {
    @Override
    public void rowInserted(Row row) {}
    @Override
    public void rowDeleted(Row row) { }
    @Override
    public void rowUpdated(Row row) {}
});

通過這種方式openLiveQuery是可以實時獲取到結(jié)果的,當(dāng)工作內(nèi)存中的數(shù)據(jù)發(fā)生變化,這個地方是可以感知到的。

四、實現(xiàn)

此處只列出部分核心代碼,一些無關(guān)的代碼不列出。

1、無參數(shù)query的使用

1、drl文件編寫

// 不帶參數(shù)的查詢
query "query01"
	// 注意這個地方的 $p,java代碼中需要用到
    $p: Person(age < 18)
end

2、java文件編寫

// 不帶參數(shù)的query查詢
QueryResults queryResults = kieSession.getQueryResults("query01");
queryResults.iterator().forEachRemaining(row -> {
    // 那么這個地方的 $p 是怎么來的呢?其實是我們自己編寫的drl query中寫的
    Person person = (Person) row.get("$p");
    log.info("query01從工作內(nèi)存中獲取的query: {}", person);
});

2、有參數(shù)query的使用

1、drl文件編寫

// 帶參數(shù)的查詢
query query02(Integer $age)
    $p: Person(age < $age)
end

2、java文件編寫

// 不帶參數(shù)的query查詢
// 帶參數(shù)的query查詢
queryResults = kieSession.getQueryResults("query02", 20);
queryResults.iterator().forEachRemaining(row -> {
    Person person = (Person) row.get("$p");
    log.info("query02從工作內(nèi)存中獲取的query: {}", person);
});

3、java代碼中openLiveQuery的使用

1、drl文件編寫

// 帶參數(shù)的查詢-查詢工作內(nèi)存Person對象的age的值小于外部傳遞進(jìn)來的$age值
query query02(Integer $age)
    $p: Person(age < $age)
end
// 定義一個規(guī)則,當(dāng)規(guī)則內(nèi)存中的Person的age小于18時,直接年齡+1
rule "rule_test_live_query_in_java"
    no-loop true
    when
        $p: Person($age:age < 18)
    then
        modify($p){
        	// 此處修改了工作內(nèi)存中age對象的值
            setAge($p.getAge() + 1)
        }
        System.out.println("更新來規(guī)則內(nèi)存中Person["+$p.getName()+"]的age:["+$p.getAge()+"]值");
end

解釋:
1、定義查詢query02查詢工作內(nèi)存中的對象。
2、rule_test_live_query_in_java里面存在一個 modify($p) 這個操作會導(dǎo)致更新工作內(nèi)存中對象的值。
3、no-loop true表達(dá)的是當(dāng)前規(guī)則是否可以多次執(zhí)行,就我們定義的這個規(guī)則,如果修改后的age<18那么可能還會導(dǎo)致規(guī)則的重新出發(fā),加了no-loop true則只會觸發(fā)一次。

2、java文件編寫

public static void main(String[] args) {
    KieServices kieServices = KieServices.get();
    KieContainer kieContainer = kieServices.getKieClasspathContainer();
    KieSession kieSession = kieContainer.newKieSession("query-ksession");
    kieSession.addEventListener(new DebugRuleRuntimeEventListener());
    kieSession.addEventListener(new DebugAgendaEventListener());
    kieSession.addEventListener(new DebugProcessEventListener());
    // 實時查詢
    kieSession.openLiveQuery("query02", new Object[]{20}, new ViewChangedEventListener() {
        @Override
        public void rowInserted(Row row) {
            Person person = (Person) row.get("$p");
            log.info("實時查詢-query02向工作內(nèi)存中插入Person: {}", person);
        }
        @Override
        public void rowDeleted(Row row) {
            Person person = (Person) row.get("$p");
            log.info("實時查詢-query02向工作內(nèi)存中刪除Person: {}", person);
        }
        @Override
        public void rowUpdated(Row row) {
            Person person = (Person) row.get("$p");
            log.info("實時查詢-query02向工作內(nèi)存中更新Person: {}", person);
        }
    });
    Person person1 = new Person("張三", 16);
    kieSession.insert(person1);
    kieSession.fireAllRules();
    kieSession.dispose();
}

解釋:
1、此處先使用了openLiveQuery查詢。
2、讓后向工作內(nèi)存中insert(person1),并且觸發(fā)了所有的規(guī)則fireAllRules

3、輸出結(jié)果

10:08:54.415 [main] INFO com.huan.drools.querys.DroolsLiveQueryApplication - 實時查詢-query02向工作內(nèi)存中插入Person: Person(name=張三, age=16)
更新來規(guī)則內(nèi)存中Person[張三]的age:[17]值
10:08:54.420 [main] INFO com.huan.drools.querys.DroolsLiveQueryApplication - 實時查詢-query02向工作內(nèi)存中更新Person: Person(name=張三, age=17)

可以看到,openLiveQuery實時查詢到了工作內(nèi)存中變更的對象。

4、rule中使用query

drl文件編寫

// 定義一個查詢,Person#name 需要以$prefix開頭
query personNameStartsWith(String $prefix)
    Person(name.startsWith($prefix))
end
rule "rule_person_name_starts_with"
    when
        $p: Person($age:age < 18)
        personNameStartsWith("張";) // 此處多個參數(shù)使用 , 分割,并且最后必須以 ; 結(jié)尾
    then
        System.out.println("在rule中使用query");
end

如果出現(xiàn)了如下異常Query's must use positional or bindings, not field constraints: "張" : [Rule name='rule_person_name_starts_with'],這個是因為我們在rule中調(diào)用query時,參數(shù)沒有以;結(jié)尾。正確用法personNameStartsWith("張";)

?personNameStartsWith("張";) 和 personNameStartsWith("張";)是不一樣的。The ? symbol means the query is pull only, once the results are returned you will not receive further results as the underlying data changes

五、完整代碼

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

六、參考鏈接

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

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

相關(guān)文章

  • java如何將控制臺輸出日志寫入到指定文件中

    java如何將控制臺輸出日志寫入到指定文件中

    這篇文章主要介紹了java如何將控制臺輸出日志寫入到指定文件中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SpringBoot 利用RestTemplate http測試

    SpringBoot 利用RestTemplate http測試

    這篇文章主要介紹了SpringBoot 利用RestTemplate http測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java模板動態(tài)生成word文件的方法步驟

    Java模板動態(tài)生成word文件的方法步驟

    最近項目中需要根據(jù)模板生成word文檔,模板文件也是word文檔。本文使用使用freemarker模板生成word文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot登錄驗證token攔截器的實現(xiàn)

    SpringBoot登錄驗證token攔截器的實現(xiàn)

    本文主要介紹了SpringBoot登錄驗證token攔截器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • gradle安裝配置以及使用最新方法

    gradle安裝配置以及使用最新方法

    這篇文章主要給大家介紹了關(guān)于gradle安裝配置以及使用的相關(guān)資料,Gradle是一個基于ApacheAnt和ApacheMaven概念的項目自動化構(gòu)建開源工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Springboot如何設(shè)置多數(shù)據(jù)源,隨時切換

    Springboot如何設(shè)置多數(shù)據(jù)源,隨時切換

    這篇文章主要介紹了Springboot如何設(shè)置多數(shù)據(jù)源,隨時切換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java實現(xiàn)漢字轉(zhuǎn)拼音

    java實現(xiàn)漢字轉(zhuǎn)拼音

    這篇文章主要介紹了java實現(xiàn)漢字轉(zhuǎn)拼音的功能,感興趣的小伙伴們可以參考一下
    2015-12-12
  • springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法

    springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法

    本文主要介紹了springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Spring容器初始化及問題解決方案

    Spring容器初始化及問題解決方案

    這篇文章主要介紹了Spring容器初始化及問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Springboot使用Rabbitmq的延時隊列+死信隊列實現(xiàn)消息延期消費

    Springboot使用Rabbitmq的延時隊列+死信隊列實現(xiàn)消息延期消費

    本文介紹了RabbitMQ的延時隊列和死信隊列,解釋了它們的工作原理及其應(yīng)用場景,延時隊列允許消息在設(shè)定的時間后被消費,結(jié)合實際案例,展示了如何實現(xiàn)和使用延時隊列和死信隊列,感興趣的朋友一起看看吧
    2025-01-01

最新評論

保定市| 北京市| 循化| 迭部县| 北京市| 安宁市| 陈巴尔虎旗| 吉木萨尔县| 新邵县| 舞阳县| 沈丘县| 措美县| 盐城市| 石景山区| 涿州市| 潮安县| 江都市| 深圳市| 临颍县| 峨眉山市| 中超| 石阡县| 民权县| 浑源县| 丰镇市| 茶陵县| 邯郸市| 东明县| 望谟县| 和顺县| 罗城| 湖口县| 高台县| 三门峡市| 荥阳市| 松原市| 义马市| 木兰县| 神农架林区| 泾源县| 保亭|