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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Drools规则引擎使用

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

Drools

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

Drools語(yǔ)法

規(guī)則文件

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

package

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

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

import

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

import com.drools.demo.point.PointDomain;

rule

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

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

rule attributes
條件部分- LHS

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

操作符

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

結(jié)果部分- RHS

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

then: thenSystem.out.println("OK"); //會(huì)在控制臺(tái)打印出ok end insert:往當(dāng)前workingMemory中插入一個(gè)新的Fact對(duì)象,會(huì)觸發(fā)規(guī)則的再次執(zhí)行,除非使用no-loop限定 update:更新 modify:修改,與update語(yǔ)法不同,結(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规则引擎使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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