drools之helloworld
所有項(xiàng)目都是被需求變更累死的,eXtreme Programing提供了一種哲學(xué),一種態(tài)度,但更實(shí)際的,是那些能夠應(yīng)付需求變更的技術(shù)。比如用OLAP支持復(fù)雜報(bào)表的快速定制,用script語言如Groovy支持客戶自定義公式,
還有Rule Engine,我們一天到晚掛在口上的親愛的商業(yè)規(guī)則。
Rule Engine并不新鮮,但通常只要一些名詞已經(jīng)足夠把所有普通項(xiàng)目組震退,CLisp、Rete、前向推導(dǎo).... 惟有Drools,終于把java和xml帶回我們身邊,讓規(guī)則引擎簡(jiǎn)單到和JSP一樣可以進(jìn)入所有的程序組。
先看一段精簡(jiǎn)又實(shí)用的HelloWorld,由兩部分組成, 一個(gè)是調(diào)用規(guī)則的test.jsp :
//設(shè)置一個(gè)測(cè)試用的VO
Vo vo = new Vo();
vo.setPoStatus("A:draft");
//讀入規(guī)則
RuleBase ruleBase = RuleBaseBuilder.buildFromURL("rule.drl");
//把vo放入WorkingMemory中并執(zhí)行
WorkingMemory workingMemory = ruleBase.newWorkingMemory( );
workingMemory.assertObject( vo );
workingMemory.fireAllRules( );
//顯示結(jié)果
out.print(po.getPoStatus());
一個(gè)是規(guī)則文件rule.drl:
<rule-set name="test rules"
<rule name="Bob Likes Cheese">
<parameter identifier="vo">
<java:class>com.ito.vo</java:class>
</parameter>
<java:condition>vo.getStatus().equals("A:draft")</java:condition>
<java:consequence>
vo.setStatus("B:order");
</java:consequence>
</rule>
</rule-set>
整個(gè)規(guī)則分成三段, 第一段定義剛剛放入的對(duì)象; 第二段用Java語法判斷條件; 第三段為條件符合時(shí)的執(zhí)行語句
真的非常簡(jiǎn)單吧
經(jīng)過小范圍的試用,發(fā)現(xiàn)沒有這么簡(jiǎn)單,因?yàn)镈rools主要提供了一個(gè)RETE的規(guī)則匹配算法和一個(gè)Script Engine,具體怎么用,還很靠自己。如果drl文件的定義方式和RETE算法能夠使條件的表達(dá)大大簡(jiǎn)化,那么它就是有用的。否則,一段重構(gòu)后的代碼能夠達(dá)到和drl文件相仿的功能。所以,還是要多看點(diǎn)基礎(chǔ),把Business Rules用在正確的地方。
提供一個(gè)eclipse的插件 url: http://www.zymose.com/index.html
posted on 2007-06-28 08:57 junky 閱讀(375) 評(píng)論(0) 編輯 收藏 所屬分類: 規(guī)則引擎