【正文】
()。 ( kitchenFireHandle )。 Raise the alarm Turn on the sprinkler for room kitchen Turn on the sprinkler for room office 過(guò)了一會(huì)兒,火災(zāi)被撲滅, Fire 實(shí)例被撤銷。 FactHandle officeFireHandle = ( officeFire )。 Fire officeFire = new Fire( ( office ) )。 在引擎中使用了火災(zāi),一旦調(diào)用 fireAllRules(),報(bào)警被引發(fā),各自的噴頭會(huì)被打開。 } () Everything is ok 我們現(xiàn)在創(chuàng)建兩個(gè)火災(zāi),并插入它們;這次為返回的 FactHandle 保存一個(gè)引用。 Sprinkler sprinkler = new Sprinkler( room )。 ( name, room )。 MapString,Room name2room = new HashMapString,Room()。調(diào)用 ()讓規(guī)則引發(fā),但是沒有火災(zāi),所以它只發(fā)送一個(gè)健康信息。四個(gè) Room 對(duì)象被創(chuàng)建,并被插入,以及為每個(gè)房間創(chuàng)建了一個(gè) sprinkler 對(duì)象。 StatefulKnowledgeSession ksession = ()。 if ( () ) { ( ().toString() )。 KnowledgeBuilder kbuilder = ()。然后,我們可以構(gòu)建知識(shí)庫(kù),如前面的一樣,只是要使用了新的 文件。 rule Status output when things are ok when not Alarm() not Sprinkler( on === true ) then ( Everything is ok )。 ( Cancel the alarm )。 end 同樣,當(dāng)沒有火災(zāi)時(shí),我們希望消除報(bào)警,所在, not 關(guān)鍵字再次使用。 rule Raise the alarm when we have one or more fires when exists Fire() then insert( new Alarm() )。當(dāng)火災(zāi)發(fā)生,一個(gè) Alarm 對(duì)象被創(chuàng)建,無(wú)論發(fā)生了多少個(gè)火災(zāi),而整個(gè)建筑只需要一個(gè) Alarm。 ( Turn off the sprinkler for room + $() )。下面給出的規(guī)則,一旦那個(gè)房間的火消失,馬上就會(huì)關(guān)閉噴頭。 Drools 也支持一階邏輯,允許你查看數(shù)據(jù)的集合。 迄今為止,我們的規(guī)則,已告訴我們匹配數(shù)據(jù)在什么時(shí)候存在,但對(duì)于它什么時(shí)候不存在呢?我們?nèi)?何確定一個(gè)火災(zāi)已被熄滅,即,不再有任何 Fire 對(duì)象。無(wú)狀態(tài)會(huì)話通常不使用推理,所以引擎不必知道數(shù)據(jù)的改變。這樣修改了數(shù)據(jù),并讓引擎知道這樣改變,因此可以再次遍及它們推斷。 end 相反,無(wú)狀態(tài)會(huì)話使用標(biāo)準(zhǔn)的 Java 語(yǔ)法修 改一個(gè)字段,在上面的規(guī)則中,我們使用了 modify 語(yǔ)句,它充當(dāng)一種 with語(yǔ)句。 rule When there is a fire turn on the sprinkler when Fire($room : room) $sprinkler : Sprinkler( room == $room, on == false ) then modify( $sprinkler ) { setOn( true ) }。該規(guī)則使用了一個(gè)有關(guān) Fire 對(duì)象的 room字段的綁定來(lái)約束匹配給那個(gè)房間的噴頭,它當(dāng)前是關(guān)閉的。這種 join(聯(lián)合) 過(guò)程導(dǎo)致了所謂的交叉生產(chǎn),該點(diǎn)包含在下面的章節(jié)中。但是,一個(gè)房子有多個(gè)房間,所以規(guī)則必須表示對(duì)象間的關(guān)系,比如一個(gè)噴頭是在一個(gè)確定的房間中。 // getter and setter methods here } public class Alarm { } 在前面的無(wú)狀態(tài)會(huì)話章節(jié)中,已經(jīng)介紹了插入和根據(jù)數(shù)據(jù)匹配的概念。 private boolean on。如果在一個(gè)房間中起火,我們利用單個(gè) Fire 實(shí)例表示。 我們利用一個(gè)引發(fā)火警的例子闡明監(jiān)測(cè)用例。 ??診斷 ??故障發(fā)現(xiàn)、醫(yī)用診斷 ??后勤 ??包裹跟蹤和交貨供應(yīng) ??協(xié)議 ??市場(chǎng)交易的合法性驗(yàn)證 與無(wú)狀態(tài)會(huì)話對(duì)照,為確保沒有內(nèi)存泄漏,在事后調(diào)用必須 dispose()方法,因?yàn)楫?dāng)創(chuàng)建有狀態(tài)知識(shí)會(huì)話時(shí),知識(shí)庫(kù)包含了它們的引用。 有狀態(tài)知識(shí)會(huì)話 有狀態(tài)會(huì)話存活更長(zhǎng),允許隨時(shí)間迭代變化。 assertEquals( new Person( Mr John Smith ), ( mrSmith ) )。 ( ( new Person( Mr John Doe ), mrDoe )。 ListCommand cmds = new ArrayListCommand()。 ( ( new Object[] { application, applicant } ) )。 兩個(gè)執(zhí)行方法 execute(Object object)和 execute(Iterabl e objects),實(shí)際上是用于 接口 BatchExecutor 的方法 execute(Command mand)的便利方法 。 ( ( new Object[] { application, applicant } ) )。 Application application = new Application()。 StatelessKnowledgeSession ksession = ()。 end 不幸的是, java 數(shù)組沒有實(shí)現(xiàn) Iterable 接口,所以我們必須使用 JDK 轉(zhuǎn)換方法 (...)。 package rule Is of valid age when Applicant( age 18 ) $a : Application() then $( false )。 private boolean valid。 private int age。讓我們?cè)黾右粋€(gè)名為 Application(申請(qǐng))類,它存放申請(qǐng)的日期,我們也移動(dòng) boolean valid 字段到這個(gè) Application 類中。因?yàn)樯暾?qǐng)人( applicant)小于 18 歲,所以申請(qǐng)被標(biāo)記為無(wú)效。 assertFalse( () )。 assertTrue( () )