pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

drools中query的用法小結

這篇文章主要介紹了drools中query的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、背景

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

二、需求

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

三、前置需求

1、query的語法結構

query queryName(參數列表)
end

注意事項:

query的名字在同一個KIE base的所有包中必須要唯一,一般情況下我們全局唯一即可。query沒有whenthen的部分

2、java中如何獲取query的結果

1、通過getQueryResults獲取

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

通過這種方式getQueryResults獲取到的結果只會獲取一次,如果工作內存中的數據發生了變化,則不會自動感知到。

2、通過openLiveQuery獲取

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

通過這種方式openLiveQuery是可以實時獲取到結果的,當工作內存中的數據發生變化,這個地方是可以感知到的。

四、實現

此處只列出部分核心代碼,一些無關的代碼不列出。

1、無參數query的使用

1、drl文件編寫

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

2、java文件編寫

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

2、有參數query的使用

1、drl文件編寫

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

2、java文件編寫

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

3、java代碼中openLiveQuery的使用

1、drl文件編寫

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

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

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向工作內存中插入Person: {}", person);
        }
        @Override
        public void rowDeleted(Row row) {
            Person person = (Person) row.get("$p");
            log.info("實時查詢-query02向工作內存中刪除Person: {}", person);
        }
        @Override
        public void rowUpdated(Row row) {
            Person person = (Person) row.get("$p");
            log.info("實時查詢-query02向工作內存中更新Person: {}", person);
        }
    });
    Person person1 = new Person("張三", 16);
    kieSession.insert(person1);
    kieSession.fireAllRules();
    kieSession.dispose();
}

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

3、輸出結果

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

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

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("張";) // 此處多個參數使用 , 分割,并且最后必須以 ; 結尾
    then
        System.out.println("在rule中使用query");
end

如果出現了如下異常Query's must use positional or bindings, not field constraints: "張" : [Rule name='rule_person_name_starts_with'],這個是因為我們在rule中調用query時,參數沒有以;結尾。正確用法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

到此這篇關于drools中query的使用的文章就介紹到這了,更多相關drools query使用內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 细胞染色-流式双标-试剂盒免费代做-上海研谨生物科技有限公司 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 天津云仓-天津仓储物流-天津云仓一件代发-顺东云仓 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 江苏远邦专注皮带秤,高精度皮带秤,电子皮带秤研发生产 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 湿地保护| 联系我们老街华纳娱乐公司官网19989979996(客服) | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 |