差沙的密碼 -- SSHWSFC's code
閱讀本Blog請(qǐng)自備塑料袋一只
BlogJava
首頁(yè)
新文章
新隨筆
聚合
管理
posts - 14, comments - 59, trackbacks - 0
關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
這兩天在
springside
受白衣的影響開(kāi)始關(guān)注drools。說(shuō)他是平民的腳本引擎一點(diǎn)都不假,使用起來(lái)極為方便,本來(lái)以為網(wǎng)上應(yīng)該有不少的講解了,但是發(fā)現(xiàn)幾乎全是針對(duì)2.0版本講解的。而drools加入jboss后有了質(zhì)的變化,下面來(lái)看一下最新的3.0使用起來(lái)有什么不同:
首先我們要取得rule,規(guī)則引擎、規(guī)則引擎,取得規(guī)則是必要的。
private
?
static
?RuleBase?readRule()?
throws
?Exception?
{
????????
//
read?in?the?source
????????Reader?source?
=
?
new
?InputStreamReader(?DroolsTest.
class
.getResourceAsStream(?
"
/aclcreat.drl
"
?)?);
????????
????????
//
optionally?read?in?the?DSL?(if?you?are?using?it).
????????Reader?dsl?
=
?
new
?InputStreamReader(?DroolsTest.
class
.getResourceAsStream(?
"
/mylang.dsl
"
?)?);
????????
//
Use?package?builder?to?build?up?a?rule?package.
????????
//
An?alternative?lower?level?class?called?"DrlParser"?can?also?be?used
????????
????????PackageBuilder?builder?
=
?
new
?PackageBuilder();
????????
//
this?wil?parse?and?compile?in?one?step
????????
//
NOTE:?There?are?2?methods?here,?the?one?argument?one?is?for?normal?DRL.
????????
//
builder.addPackageFromDrl(?source?);
????????
//
Use?the?following?instead?of?above?if?you?are?using?a?DSL:
????????builder.addPackageFromDrl(?source,?dsl?);
????????
????????
//
get?the?compiled?package?(which?is?serializable)
????????Package?pkg?
=
?builder.getPackage();
????????
????????
//
add?the?package?to?a?rulebase?(deploy?the?rule?package).
????????RuleBase?ruleBase?
=
?RuleBaseFactory.newRuleBase();
????????ruleBase.addPackage(?pkg?);
????????
return
?ruleBase;
????}
這里在官方的例子基礎(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í)行它:
????????????WorkingMemory?workingMemory?
=
?ruleBase.newWorkingMemory();
????????????
????????????
//
go?!
????????????Order?order?
=
?
new
?Order();
????????????order.setId(
1
);
????????????order.setName(
"
testOrder
"
);
????????????order.setTotlePrice(
10
);
????????????????????????
????????????User?user?
=
?
new
?User();
????????????user.setName(
"
testAdmin
"
);
????????????user.setAuth(
"
USER_ADMIN
"
);
????????????List
<
String
>
?roles?
=
?
new
?ArrayList
<
String
>
();
????????????roles.add(
"
ADMIN
"
);
????????????user.setRoles(roles);
????????????
????????????User?user1?
=
?
new
?User();
????????????user1.setName(
"
testUser
"
);
????????????user1.setAuth(
"
USER_USER
"
);
????????????List
<
String
>
?roles1?
=
?
new
?ArrayList
<
String
>
();
????????????roles1.add(
"
USER
"
);
????????????user1.setRoles(roles1);
????????????
????????????workingMemory.assertObject(order);
????????????workingMemory.assertObject(user);
????????????workingMemory.assertObject(user1);
????????????
????????????workingMemory.fireAllRules();????????
????????????
????????????List
<
AclEntry
>
?acls?
=
?workingMemory.getObjects(AclEntry.
class
);
用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了:
#created?on:?
2006
-
5
-
19
package
?com.sample;
#list?any?
import
?classes?here.
import
?com.sample.domain.Order;
import
?com.sample.domain.User;
import
?com.sample.AclEntry;
#expander?mylang.dsl
#declare?any?global?variables?here
rule?
"
Order?TotlePrice?more?than?$1000
"
????
????when
????????#conditions
????????$order?:?Order(?totlePrice?
>
?
1000
?)
????????$user?:?User(?roles?contains?
"
ADMIN
"
?,?$userName?:?name)
????then?
????????#actions
????????System.out.println(
"
More?Than
"
);
????????
assert
(
new
?AclEntry($order,?$user,?
1
));
end
rule?
"
Order?TotlePrice?less?or?equl?than?$1000
"
????
????when
????????#conditions
????????$order?:?Order(?totlePrice?
<=
?
1000
?)
????????$user?:?User(?$userName?:?name?)
????then?
????????#actions
????????System.out.println(
"
Less?Than
"
);
????????
assert
(
new
?AclEntry($order,?$user,?
2
));
end
每一個(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í)。
List
<
AclEntry
>
?acls?
=
?workingMemory.getObjects(AclEntry.
class
);
這樣就能在workingMemory里面掏出我們需要的事實(shí)來(lái),新鮮出爐的哦。
相當(dāng)粗略的講了一下drools,目的是希望大家都來(lái)了解一下,共同學(xué)習(xí)。
posted on 2006-05-28 20:53
差沙
閱讀(2842)
評(píng)論(9)
編輯
收藏
所屬分類:
avaj
FeedBack:
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-28 22:46 |
艾塵
開(kāi)始接觸Drools。一起學(xué)習(xí)! :)
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-28 23:54 |
差沙
我是剛剛開(kāi)始,以后多交流。對(duì)了,你要用在什么場(chǎng)合?
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-29 21:20 |
C[ETI]O@quaffsoft
$userName : name
表示什么意思?把user的name屬性值賦給userName變量?
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-29 21:34 |
C[ETI]O@quaffsoft
@C[ETI]O@quaffsoft
$userName是變量
System.out.println("More Than 50,userName"+$userName);
System.out.println("More Than 50,userName"+$user.getName());
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-29 22:28 |
差沙
@C[ETI]O@quaffsoft
正解
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2006-05-30 22:15 |
C[ETI]O@quaffsoft
如何判斷一個(gè)Integer?比如要判斷一個(gè)大于10的Integer
$integer:Integer(),括號(hào)里面怎么寫,,目前的做法是寫一個(gè)類弄個(gè)Integer類型屬性
回復(fù)
更多評(píng)論
#
xuxqqhyo
2007-06-15 05:35 |
xuxqqhyo
dbdwwyon
http://lvunjlvs.com
llokaulb gtskgzvt
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2008-04-22 14:02 |
javapon
你好~最近正學(xué)Drools呢~可網(wǎng)上的資料并不是很多,特別是.dsl文件網(wǎng)上大部分多是XML文件格式的那種~~~~你有相關(guān)的資料嗎?或關(guān)于Drools的小編程~~~~望能發(fā)一份給我~~~謝謝了。郵箱 javapon@163.com
回復(fù)
更多評(píng)論
#
re: 關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
2008-04-22 14:05 |
javapon
@@本來(lái)以為網(wǎng)上應(yīng)該有不少的講解了,但是發(fā)現(xiàn)幾乎全是針對(duì)2.0版本講解的.
恩對(duì)找了老半天也找不到新版本的講解~~~~
回復(fù)
更多評(píng)論
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
Google Developer Day 收獲
Android上的MSN初見(jiàn)成效~~!!
Android發(fā)布, Android中國(guó)網(wǎng)站正式成立, 歡迎訪問(wèn)
JBPM的Token路徑問(wèn)題
秀逗的JBPM
在Acegi中使用ACL
關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)
這家伙很懶,但起碼還是寫了一句話。
<
2006年5月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(8)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
avaj(10)
bew(3)
nohtyp(1)
ROR(2)
ten.
tfil(1)
xunil(2)
隨筆檔案
2008年6月 (1)
2008年3月 (1)
2008年2月 (2)
2007年11月 (1)
2007年10月 (1)
2007年4月 (1)
2006年11月 (2)
2006年8月 (1)
2006年6月 (2)
2006年5月 (2)
文章分類
avaj
bew
nohtyp
php
ten.
xunil
搜索
最新評(píng)論
1.?re: Ext的組件結(jié)構(gòu)分析,附Ext組件結(jié)構(gòu)圖
附件在哪里呀?
--haha.
2.?re: Ext的組件結(jié)構(gòu)分析,附Ext組件結(jié)構(gòu)圖
真的很不錯(cuò)哦
--zds
3.?re: Ext的組件結(jié)構(gòu)分析,附Ext組件結(jié)構(gòu)圖
組件呢
--alian
4.?re: Air+Ext小試一下
Ext,sqlite怎么處理事務(wù)呢?
--cow
5.?您好,我想問(wèn)問(wèn)Android里的IM是使用SIP協(xié)議么?
您好,我想問(wèn)問(wèn)Android里的IM是使用SIP協(xié)議么?
非常感謝
我的郵箱是dongzhiming@hisense.com
--董智明
閱讀排行榜
1.? Ext的組件結(jié)構(gòu)分析,附Ext組件結(jié)構(gòu)圖(7722)
2.?秀逗的JBPM(5744)
3.?Air+Ext小試一下(4810)
4.?說(shuō)說(shuō)Rails吧,啟動(dòng)開(kāi)始。(4572)
5.?Android上的MSN初見(jiàn)成效~~??!(4216)
評(píng)論排行榜
1.? Ext的組件結(jié)構(gòu)分析,附Ext組件結(jié)構(gòu)圖(25)
2.?關(guān)于Drools的初步,迷醉狀態(tài)認(rèn)識(shí)(9)
3.?秀逗的JBPM(7)
4.?在Acegi中使用ACL(4)
5.?Google Developer Day 收獲(4)
Copyright ©2025 差沙 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲国产精品无码第一区二区三区
|
337p欧洲亚洲大胆艺术
|
日韩电影免费在线观看视频
|
成年女性特黄午夜视频免费看
|
免费人成在线观看播放a
|
一级毛片免费不卡
|
99久久免费中文字幕精品
|
黄+色+性+人免费
|
免费一看一级毛片人
|
免费a级毛片永久免费
|
亚洲中文字幕无码爆乳app
|
www.xxxx.com日本免费
|
国产桃色在线成免费视频
|
中文字幕亚洲乱码熟女一区二区
|
亚洲精品偷拍无码不卡av
|
成人在线免费视频
|
黄色片在线免费观看
|
亚洲精品美女久久久久久久
|
四虎永久在线精品视频免费观看
|
亚洲日韩在线视频
|
成全视频免费观看在线看
|
特级淫片国产免费高清视频
|
亚洲综合一区二区国产精品
|
一个人看的在线免费视频
|
亚洲春色在线视频
|
国产亚洲美女精品久久
|
午夜国产精品免费观看
|
亚洲国产精品99久久久久久
|
亚洲国产精品日韩专区AV
|
亚洲人成色777777精品
|
久久这里只精品热免费99
|
亚洲区不卡顿区在线观看
|
亚洲日韩国产一区二区三区在线
|
四虎在线播放免费永久视频
|
一级有奶水毛片免费看
|
亚洲第一页综合图片自拍
|
国内永久免费crm系统z在线
|
亚洲精品国产国语
|
黄色免费在线网站
|
黑人大战亚洲人精品一区
|
30岁的女人韩剧免费观看
|