Drools-第一天
第一天記錄:搭建基礎(chǔ)項目,完成基本語法的學(xué)習(xí)。
maven方式引入jar包;
? ?<dependency>
? ? ? ?<groupId>org.drools</groupId>
? ? ? ?<artifactId>drools-core</artifactId>
? ? ? ?<version>6.4.0.Final</version>
? ?</dependency>
? ?<dependency>
? ? ? ?<groupId>org.drools</groupId>
? ? ? ?<artifactId>drools-compiler</artifactId>
? ? ? ?<version>6.4.0.Final</version>
? ?</dependency>
創(chuàng)建resource/META-INF/kmodule.xml標(biāo)準配置文件
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<!--?? name:指定kbase的名稱,可以任意;
????????packages:指定規(guī)則文件的目錄;
????????default:指定當(dāng)前kbase是否為默認;-->
? ?<kbase name="rules" packages="rules">
<!--???name:指定ksession的名稱,可以任意;
????????default:指定當(dāng)前session是否為默認;? -->
? ? ? ?<ksession name="ksession-rules"/>
? ?</kbase>
</kmodule>
創(chuàng)建作為載體的實體類(class)為載體類添加get,set方法;
在packages指定的規(guī)則文件目錄下創(chuàng)建drl文件;
創(chuàng)建測試類進行創(chuàng)建;
Drools基礎(chǔ)語法:
drl文件構(gòu)成:
package:包名,邏輯上的空間;
import:用于導(dǎo)入;
global:全局變量;
function:自定義函數(shù);
query:查詢;
rule -- end:規(guī)則體;

規(guī)則體語法結(jié)構(gòu):
rule "ruleName"
????attributes
? ? when
????????LHS
? ? then
????????RHS
end
rule:表示規(guī)則開始,規(guī)則的名稱唯一;
attributes:規(guī)則屬性,類似于變量;
when:if關(guān)鍵字,后面是規(guī)則的條件;
LHS(Left Hand Side):規(guī)則條件部分;
then:do關(guān)鍵字,后面是結(jié)果部分;
RHS(Right Hand Side):結(jié)果行動部分的通用名稱;
end:表示規(guī)則結(jié)束;

Pattern模式匹配:
語法結(jié)構(gòu)為:綁定變量名:Object--引入的類--(約束條件)
例:$user:User(name?=?'wang')
在LHS中定義的變量名在RHS中就可以直接使用;
當(dāng)內(nèi)存中存在User類型的變量(類型約束)并且名字為wang(屬性約束)時規(guī)則才激活;
綁定變量名也可以作用在屬性上;
例:$user:User($username:name?=?'wang')
多個pattern中可以使用and和or鏈接(默認and不寫就是and)
$user:User($username:name?=?'wang')? and
$user:User(name?=?'wang')

比較操作符:
>,<,>=,<=,==,!=? 和java代碼中意義相同
contains,not contains 包含和不包含;
Object(Field[Collection/Array] cotains value);
Object(Field[Collection/Array] not cotains value);
memberOf,not?memberOf?是否在一個或多個集合中;
Object(Field?memberOfvalue[Collection/Array]);
Object(Field?not?memberOfvalue[Collection/Array]);
matches,not matches 是否與提供的標(biāo)準java正則表達式匹配;
Object(Field?matches?"正則表達式");
Object(Field not?matches?"正則表達式");

執(zhí)行指定規(guī)則:
當(dāng)我們只想從所有滿足條件的規(guī)則中,執(zhí)行某些指定的規(guī)則時需要修改java代碼;
接口AgendaFilter作為指定激活規(guī)則的過濾器,實現(xiàn)子類可以寫入到激活方法中。
包括:
RuleNameStartsWithAgendaFilter? 頭部相同的規(guī)則;
RuleNameEndsWithAgendaFilter? 結(jié)尾相同的規(guī)則;
RuleNameEeualsWithAgendaFilter? 全相同的規(guī)則;
RulenameMatchesAgendaFilter? 滿足正則表達式的規(guī)則;
RuleNameSerializationAgendaFilter? 滿足可序列化的規(guī)則;

Drools內(nèi)置方法:
update:更新工作內(nèi)存中的數(shù)據(jù),實現(xiàn)相關(guān)規(guī)則的重新匹配;
drl中:then? update(user);
insert:插入工作內(nèi)存中的數(shù)據(jù),實現(xiàn)相關(guān)規(guī)則的重新匹配;
drl中:then? insert(new User('wang'));
retract:刪除工作內(nèi)存中的數(shù)據(jù),實現(xiàn)相關(guān)規(guī)則的重新匹配;
drl中:then? retract(user);
