差沙的密碼 -- SSHWSFC's code
閱讀本Blog請自備塑料袋一只
BlogJava
首頁
新文章
新隨筆
聚合
管理
posts - 14, comments - 59, trackbacks - 0
關于Drools的初步,迷醉狀態認識
這兩天在
springside
受白衣的影響開始關注drools。說他是平民的腳本引擎一點都不假,使用起來極為方便,本來以為網上應該有不少的講解了,但是發現幾乎全是針對2.0版本講解的。而drools加入jboss后有了質的變化,下面來看一下最新的3.0使用起來有什么不同:
首先我們要取得rule,規則引擎、規則引擎,取得規則是必要的。
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;
????}
這里在官方的例子基礎上做了自己的實現(其實什么都沒改)。
可以看到,第一步是取得文件IO,這個文件就是我們要寫得規則腳本,這個等下再說,大家可以假象一下腳本是個什么樣子,現在只說怎么在程序中取得Rule。
接下來,是使用Builder取得一個package,既然builder都上來了說明能輸入的腳本不止一個了。用addPackageFromDrl向這個builder壓縮機里面輸入腳本,當然還有另外一個文件dsl,這個后面再說。利用builder取得package。
最后構造一個BaseRule,利用Factory取得的時候是有選擇的,RuleBaseFactory.newRuleBase(int type)其中的type可以為不同的Algorithm,有RETE和Leaps 兩種。對這兩種Algorithm的具體解釋可以參看
http://citeseer.ist.psu.edu/context/505087/0
?或是 drools的文檔,其實我也不太懂。
把剛才的package添到ruleBase里面一個Rule就大功告成了。
接下來看看怎么執行它:
????????????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生成一個WorkingMemory,WorkingMemory是Rule的執行引擎,裝載rule和事實(很重要的概念),并統一執行他們。接下來我就在寫我的事實,事實是什么,事實就是今天是什么天?訂單總價多少?就是要告訴腳本的java對象。然后把事實一一壓入WorkingMemory這個大壓縮機。就瞧好吧。
OK可以執行了,fireAllRules!(真TM,COOL的名字)。當然有全部執行就有部分執行。你可以把規則分組,然后按組執行,或是指定rule的名字來執行(這里還是大家自己看看吧)。
???究竟執行了什么。當然是執行了我們的腳本,腳本在這里、看看它可不是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
每一個rule就是一個規則,所有的事實要一一過一遍這些規則。when是規則提出的條件,如果哪個事實符合這個條件,就進入then的環節,進行相應的處理。
分析一下條件:$order?:?Order(?totlePrice?
>
?
1000
?)。一看就知道是總價超過1000的訂單。$order是把這個訂單邦定,后面可以使用。
分析一下then:?System.out.println就不解釋了。
assert
(
new
?AclEntry($order,?$user,?
2
)); 這里的assert的意義就是告訴WorkingMemory一個事實,其實跟前面的加入事實一個道理。打個比方,如果有閃電,那么就有雷。
這樣走完一個rule后大家很容易發現,其實是根據訂單和用戶的角色不同產生了不同的acl,然后我要拿到這些由事實得到的事實。
List
<
AclEntry
>
?acls?
=
?workingMemory.getObjects(AclEntry.
class
);
這樣就能在workingMemory里面掏出我們需要的事實來,新鮮出爐的哦。
相當粗略的講了一下drools,目的是希望大家都來了解一下,共同學習。
posted on 2006-05-28 20:53
差沙
閱讀(2842)
評論(9)
編輯
收藏
所屬分類:
avaj
FeedBack:
#
re: 關于Drools的初步,迷醉狀態認識
2006-05-28 22:46 |
艾塵
開始接觸Drools。一起學習! :)
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2006-05-28 23:54 |
差沙
我是剛剛開始,以后多交流。對了,你要用在什么場合?
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2006-05-29 21:20 |
C[ETI]O@quaffsoft
$userName : name
表示什么意思?把user的name屬性值賦給userName變量?
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
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());
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2006-05-29 22:28 |
差沙
@C[ETI]O@quaffsoft
正解
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2006-05-30 22:15 |
C[ETI]O@quaffsoft
如何判斷一個Integer?比如要判斷一個大于10的Integer
$integer:Integer(),括號里面怎么寫,,目前的做法是寫一個類弄個Integer類型屬性
回復
更多評論
#
xuxqqhyo
2007-06-15 05:35 |
xuxqqhyo
dbdwwyon
http://lvunjlvs.com
llokaulb gtskgzvt
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2008-04-22 14:02 |
javapon
你好~最近正學Drools呢~可網上的資料并不是很多,特別是.dsl文件網上大部分多是XML文件格式的那種~~~~你有相關的資料嗎?或關于Drools的小編程~~~~望能發一份給我~~~謝謝了。郵箱 javapon@163.com
回復
更多評論
#
re: 關于Drools的初步,迷醉狀態認識
2008-04-22 14:05 |
javapon
@@本來以為網上應該有不少的講解了,但是發現幾乎全是針對2.0版本講解的.
恩對找了老半天也找不到新版本的講解~~~~
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Google Developer Day 收獲
Android上的MSN初見成效~~!!
Android發布, Android中國網站正式成立, 歡迎訪問
JBPM的Token路徑問題
秀逗的JBPM
在Acegi中使用ACL
關于Drools的初步,迷醉狀態認識
這家伙很懶,但起碼還是寫了一句話。
<
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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(8)
給我留言
查看公開留言
查看私人留言
隨筆分類
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
搜索
最新評論
1.?re: Ext的組件結構分析,附Ext組件結構圖
附件在哪里呀?
--haha.
2.?re: Ext的組件結構分析,附Ext組件結構圖
真的很不錯哦
--zds
3.?re: Ext的組件結構分析,附Ext組件結構圖
組件呢
--alian
4.?re: Air+Ext小試一下
Ext,sqlite怎么處理事務呢?
--cow
5.?您好,我想問問Android里的IM是使用SIP協議么?
您好,我想問問Android里的IM是使用SIP協議么?
非常感謝
我的郵箱是dongzhiming@hisense.com
--董智明
閱讀排行榜
1.? Ext的組件結構分析,附Ext組件結構圖(7724)
2.?秀逗的JBPM(5746)
3.?Air+Ext小試一下(4810)
4.?說說Rails吧,啟動開始。(4573)
5.?Android上的MSN初見成效~~?。?4217)
評論排行榜
1.? Ext的組件結構分析,附Ext組件結構圖(25)
2.?關于Drools的初步,迷醉狀態認識(9)
3.?秀逗的JBPM(7)
4.?在Acegi中使用ACL(4)
5.?Google Developer Day 收獲(4)
Copyright ©2025 差沙 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲精品无码久久久久秋霞
|
亚洲午夜福利717
|
亚洲AV电影天堂男人的天堂
|
91情侣在线精品国产免费
|
337p欧洲亚洲大胆艺术
|
日韩人妻一区二区三区免费
|
久久亚洲精品国产精品黑人
|
国产精品九九久久免费视频
|
亚洲精品制服丝袜四区
|
a在线观看免费视频
|
国产亚洲婷婷香蕉久久精品
|
久久久久成人片免费观看蜜芽
|
精品亚洲一区二区
|
久久久久久曰本AV免费免费
|
亚洲性69影院在线观看
|
成全视频免费高清
|
亚洲a∨无码一区二区
|
亚洲成av人片一区二区三区
|
怡红院免费全部视频在线视频
|
97se亚洲综合在线
|
在线看免费观看AV深夜影院
|
2020天堂在线亚洲精品专区
|
国产一区二区三区免费视频
|
一级日本高清视频免费观看
|
亚洲va中文字幕无码久久
|
**aaaaa毛片免费同男同女
|
亚洲综合小说另类图片动图
|
亚洲黄页网在线观看
|
国产男女猛烈无遮挡免费视频网站
|
在线91精品亚洲网站精品成人
|
亚洲一级特黄大片无码毛片
|
大地资源中文在线观看免费版
|
亚洲国产成人VA在线观看
|
a级毛片毛片免费观看久潮
|
亚洲人成免费电影
|
www国产亚洲精品久久久
|
九九美女网站免费
|
色偷偷噜噜噜亚洲男人
|
久久亚洲AV午夜福利精品一区
|
无人在线观看免费高清视频
|
国产国产人免费人成免费视频
|