首先我們要取得rule,規(guī)則引擎、規(guī)則引擎,取得規(guī)則是必要的。






























這里在官方的例子基礎(chǔ)上做了自己的實(shí)現(xiàn)(其實(shí)什么都沒(méi)改)。
可以看到,第一步是取得文件IO,這個(gè)文件就是我們要寫得規(guī)則腳本,這個(gè)等下再說(shuō),大家可以假象一下腳本是個(gè)什么樣子,現(xiàn)在只說(shuō)怎么在程序中取得Rule。
接下來(lái),是使用Builder取得一個(gè)package,既然builder都上來(lái)了說(shuō)明能輸入的腳本不止一個(gè)了。用addPackageFromDrl向這個(gè)builder壓縮機(jī)里面輸入腳本,當(dāng)然還有另外一個(gè)文件dsl,這個(gè)后面再說(shuō)。利用builder取得package。
最后構(gòu)造一個(gè)BaseRule,利用Factory取得的時(shí)候是有選擇的,RuleBaseFactory.newRuleBase(int type)其中的type可以為不同的Algorithm,有RETE和Leaps 兩種。對(duì)這兩種Algorithm的具體解釋可以參看 http://citeseer.ist.psu.edu/context/505087/0?或是 drools的文檔,其實(shí)我也不太懂。
把剛才的package添到ruleBase里面一個(gè)Rule就大功告成了。
接下來(lái)看看怎么執(zhí)行它:






























用ruleBase生成一個(gè)WorkingMemory,WorkingMemory是Rule的執(zhí)行引擎,裝載rule和事實(shí)(很重要的概念),并統(tǒng)一執(zhí)行他們。接下來(lái)我就在寫我的事實(shí),事實(shí)是什么,事實(shí)就是今天是什么天?訂單總價(jià)多少?就是要告訴腳本的java對(duì)象。然后把事實(shí)一一壓入WorkingMemory這個(gè)大壓縮機(jī)。就瞧好吧。
OK可以執(zhí)行了,fireAllRules!(真TM,COOL的名字)。當(dāng)然有全部執(zhí)行就有部分執(zhí)行。你可以把規(guī)則分組,然后按組執(zhí)行,或是指定rule的名字來(lái)執(zhí)行(這里還是大家自己看看吧)。
???究竟執(zhí)行了什么。當(dāng)然是執(zhí)行了我們的腳本,腳本在這里、看看它可不是xml了:


































每一個(gè)rule就是一個(gè)規(guī)則,所有的事實(shí)要一一過(guò)一遍這些規(guī)則。when是規(guī)則提出的條件,如果哪個(gè)事實(shí)符合這個(gè)條件,就進(jìn)入then的環(huán)節(jié),進(jìn)行相應(yīng)的處理。
分析一下條件:$order?:?Order(?totlePrice?>?1000?)。一看就知道是總價(jià)超過(guò)1000的訂單。$order是把這個(gè)訂單邦定,后面可以使用。
分析一下then:?System.out.println就不解釋了。assert(new?AclEntry($order,?$user,?2)); 這里的assert的意義就是告訴WorkingMemory一個(gè)事實(shí),其實(shí)跟前面的加入事實(shí)一個(gè)道理。打個(gè)比方,如果有閃電,那么就有雷。
這樣走完一個(gè)rule后大家很容易發(fā)現(xiàn),其實(shí)是根據(jù)訂單和用戶的角色不同產(chǎn)生了不同的acl,然后我要拿到這些由事實(shí)得到的事實(shí)。

相當(dāng)粗略的講了一下drools,目的是希望大家都來(lái)了解一下,共同學(xué)習(xí)。