日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Drools规则引擎使用

發(fā)布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Drools规则引擎使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Drools

  • Drools語法
    • 規(guī)則文件
      • package
      • import
      • rule
    • 操作符
    • Drools方法定義
    • Drools聲明類型
    • Drools關(guān)鍵詞
    • 引用

Drools語法

規(guī)則文件

規(guī)則文件可以使用 .drl文件,也可以是xml文件,這里我們使用drl文件

package

對一個規(guī)則文件而言,package是必須定義的,必須放在規(guī)則文件第一行,package的名字是隨意的,不必必須對應物理路徑,跟java的package的概念不同,這里只是邏輯上的一種區(qū)分
如:

package com.sankuai.meituan.waimai.drools.demo

import

導入規(guī)則文件需要使用到的外部規(guī)則文件或者變量,這里的使用方法跟java相同,但是不同于java的是,這里的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態(tài)方法

import com.drools.demo.point.PointDomain;

rule

定義一個具體規(guī)則。rule “ruleName”。一個規(guī)則可以包含三個部分:

屬性部分: 定義當前規(guī)則執(zhí)行的一些屬性等,比如是否可被重復執(zhí)行、過期時間、生效時間等。條件部分(LHS): 定義當前規(guī)則的條件,如 when Message(); 判斷當前workingMemory中是否存在Message對象。結(jié)果部分(RHS): 即當前規(guī)則條件滿足后執(zhí)行的操作,可以直接調(diào)用Fact對象的方法來操作應用。這里可以寫普通java代碼

rule部分
rule “ruleName”
no-loop true

when$message:Message(status == 0)thenSystem.out.println("fit");$message.setStatus(1);update($message);

end
規(guī)則詳情
屬性詳情

no-loop: 定義當前的規(guī)則是否不允許多次循環(huán)執(zhí)行,默認是false;當前的規(guī)則只要滿足條件,可以無限次執(zhí)行。什么情況下會出現(xiàn)一條規(guī)則執(zhí)行過一次又被多次重復執(zhí)行呢?drools提供了一些api,可以對當前傳入workingMemory中的Fact對象進行修改或者個數(shù)的增減,比如上述的update方法,就是將當前的workingMemory中的Message類型的Fact對象進行屬性更新,這種操作會觸發(fā)規(guī)則的重新匹配執(zhí)行,可以理解為Fact對象更新了,所以規(guī)則需要重新匹配一遍,那么疑問是之前規(guī)則執(zhí)行過并且修改過的那些Fact對象的屬性的數(shù)據(jù)會不會被重置?結(jié)果是不會,已經(jīng)修改過了就不會被重置,update之后,之前的修改都會生效。當然對Fact對象數(shù)據(jù)的修改并不是一定需要調(diào)用update才可以生效,簡單的使用set方法設置就可以完成,這里類似于java的引用調(diào)用,所以何時使用update是一個需要仔細考慮的問題,一旦不慎,極有可能會造成規(guī)則的死循環(huán)。上述的no-loop true,即設置當前的規(guī)則,只執(zhí)行一次,如果本身的RHS部分有update等觸發(fā)規(guī)則重新執(zhí)行的操作,也不要再次執(zhí)行當前規(guī)則。 但是其他的規(guī)則會被重新執(zhí)行,豈不是也會有可能造成多次重復執(zhí)行,數(shù)據(jù)紊亂甚至死循環(huán)?答案是使用其他的標簽限制,也是可以控制的:lock-on-active truelock-on-active:lock-on-active true 通過這個標簽,可以控制當前的規(guī)則只會被執(zhí)行一次,因為一個規(guī)則的重復執(zhí)行不一定是本身觸發(fā)的,也可能是其他規(guī)則觸發(fā)的,所以這個是no-loop的加強版date-expires:設置規(guī)則的過期時間,默認的時間格式:“日-月-年”date-effective:設置規(guī)則的生效時間,時間格式同上。duration:規(guī)則定時,duration 3000,3秒后執(zhí)行規(guī)則salience:優(yōu)先級,數(shù)值越大越先執(zhí)行,這個可以控制規(guī)則的執(zhí)行順序。

rule attributes
條件部分- LHS

when:規(guī)則條件開始。條件可以單個,也可以多個,多個條件一次排列 如:當前規(guī)則只有在這三個條件都匹配的時候才會執(zhí)行RHS部分 wheneval(true)$customer:Customer()$message:Message(status==0) eval(true):是一個默認的api,true 無條件執(zhí)行,類似于 while(true) 操作符:>、>=、<、<=、==、!=、contains、not contains、memberOf、not memberOf、matches、not matches

操作符

contains: 對比是否包含操作,操作的被包含目標可以是一個復雜對象也可以是一個簡單的值Person( fullName not contains "Jr" )not contains:與contains相反。memberOf:判斷某個Fact屬性值是否在某個集合中,與contains不同的是他被比較的對象是一個集合,而contains被比較的對象是單個值或者對象CheeseCounter( cheese memberOf $matureCheeses )not memberOf:與memberOf正好相反matches:正則表達式匹配Cheese( type matches "(Buffalo)?\\S*Mozarella" )注意: 就像在Java中,寫為字符串的正則表達式需要轉(zhuǎn)義“\”not matches:與matches正好相反

結(jié)果部分- RHS

當規(guī)則條件滿足,則進入規(guī)則結(jié)果部分執(zhí)行,結(jié)果部分可以是純java代碼

then: thenSystem.out.println("OK"); //會在控制臺打印出ok end insert:往當前workingMemory中插入一個新的Fact對象,會觸發(fā)規(guī)則的再次執(zhí)行,除非使用no-loop限定 update:更新 modify:修改,與update語法不同,結(jié)果都是更新操作 retract:刪除 rule "Rule 03" when $number : Number( ) not Number( intValue < $number.intValue ) then System.out.println("Number found with value: " + $number.intValue() ); retract( $number ); end

Drools方法定義

function

function String hello(String name) {
return “Hello “+name+”!”;
}

Drools聲明類型

declare:聲明類型聲明Class、Enum etc類型聲明元數(shù)據(jù)

聲明類類型

declare Address number : int streetName : String city : String end

聲明枚舉類型

declare enum DaysOfWeekSUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thursday"),FRI("Friday"),SAT("Saturday"); fullName : String end

Drools關(guān)鍵詞

關(guān)鍵詞描述詳情
lock-on-active
date-effective
date-expires
no-loop
auto-focus
activation-group
agenda-group
ruleflow-group
entry-point
duration
package
import
dialect
salience
enabled
attributes
rule
extend
when
then
when
template
query
declare
function
eval
not
in
or
and
exists
forall
exists
accumulate
collect
from
action
reverse
result
end
over
init

引用

官方文檔

總結(jié)

以上是生活随笔為你收集整理的Drools规则引擎使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。