Drools6 入門學習(一)——Drools6新特性

其實Drools6有挺多優秀的入門學習資料了,按理說沒必要在重複別人的內容了。不過由於項目的需要,需要對Drools有個透徹的瞭解甚至說現有的中文資料都沒法支持我把需求做出來,所以還是把基礎打紮實把。
所以什麼是規則引擎,什麼是Drools,就都先參考下以下資料吧。

Drools5官方中文文檔(供參考):http://pan.baidu.com/s/1sj6uoQp
Drools6的入門資料:http://blog.xiongzhijun.com/?cat=48
Drools-6.1.0.Final 入門文檔:http://pan.baidu.com/s/1bnuB4fl
Drools6官方文檔:http://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html_single/index.html

個人認爲Drools6與Drools5使用上的差距還是很大的,很多用法都已經被統一與簡化了,所以Drools5的資料可以作爲參考但是相應的例子估計都跑不起來了。
Drools6的官方文檔很強大,不過個人認爲作爲進階學習的資料不錯。


Drools6 新特性

關於爲什麼要介紹Drools6 新特性,是因爲在我剛開始接觸Drools的時候,在網上的中文資料不多,所以看到有介紹它的文章就會點進去看。很多文章往往就是這麼個標題

規則引擎 Drools 使用解析

然後靠譜的文章會告訴你下當前使用Drools環境是Drools6還是其他,但是大部分人基本沒有寫,所以當你照着文章敲例子的時候就發現什麼KnowledgeBase 、KnowledgeBuilder 爲什麼沒有,然後接下來就是糾結到底是這文章問題還是包沒有引進來!所以有必要介紹Drools5之前的版本與Drools6的用法區別!

廢話不說了,接下來介紹Drools6新特性!
官方文檔中有專門的第二章節來介紹 Chapter 2. Release Notes

Kie API

新版本與之前版本最大的區別就在於推出了一套新的基於KIE概念的API。
通過 Kie 的 API 統一了旗下的OptaPlanner、Drools、JBPM、UBerFire多個工程的使用。

Configuration and convention based projects

kmodule.xml

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
  <kbase name="kbase1" packages="org.mypackages>
    <ksession name="ksession1"/>
  </kbase>
</kmodule>

Kmodule.xml是Kie API中比較重要的一部分,之後會介紹相應的用法,在這裏只是告訴你這時新特性,別傻傻的在舊版本里面找它了。

KieModules, KieContainer and KIE-CI
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(
        ks.newReleaseId("org.mygroup", "myartefact", "1.0") );
KieSession kSession = kContainer.newKieSession("ksession1");
kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
kSession.fireAllRules();

這裏引用Drools-6.1.0.Final 入門文檔 中的介紹來介紹這個特性:

Drools推出了一套新的基於KIE概念的API,其目的是將之前版本中對規則引擎繁瑣的調用和加載過程加以簡化。
Drools6給我的最大不同就是把rules打包成jar,使用端通過kie-ci來動態從maven repo中獲取指定rules jar版本,雖然和maven有緊耦合,簡化以及清晰了rules的使用和動態升級:系統建立2個項目:一個Drools項目來實現規則,驗收規則,生成jar包,另外一個就是真正要用規則的項目,直接通過引入不同版本的jar包實習規則動態升級。

What is New and Noteworthy in Drools 6.0.0

  1. 引入新的算法PHREAK,官方文檔的意思是能讓Drools處理大量的規則以及事實。我沒有找到太多關於PHREAK算法的資料,有空再去研究下吧。
  2. Automatically firing timed rule in passive mode.這什麼意思,大致指的是Drools默認情況下是惰性的執行規則,即除非你調用了fireAllRules(),不然他不會執行規則的。而現在有一個Drools加了個新特性,能讓你改變默認的行爲,他會自動執行規則。
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
ksconf.setOption( TimedRuleExectionOption.YES );
KSession ksession = kbase.newKieSession(ksconf, null);

這個新特性什麼時候用,我還真沒數。
3. Expression Timers.

declare Bean
    delay   : String = "30s"
    period  : long = 60000
end
rule "Expression timer"
    timer( expr: $d, $p )
when
    Bean( $d : delay, $p : period )
then
end
timer (int: 30s 10s; start=3-JAN-2010, end=5-JAN-2010)

感覺就像個定時器,在從2010年1月3日開始,延遲30秒時間。之後每隔10秒發生一次,直到1月5日。

New and Noteworthy in Integration 6.0.0

關於整合的新特性,我覺得不錯的估計就是Spring以及CDI,之前版本就能與Spring整合了,而現在是可以用Spring的配置文件來代替kmodule.xml。在我看源碼的時候發現,Drools在運行的時候會到META-INF下面查找名爲kmodule-spring.xml的配置文件。

CDI
@Inject
@KSession("ksession1") 
@KReleaseId( groupId = "jar1", rtifactId = "art1", version = "1.0")
private KieSession ksessionv10;

@Inject
@KSession("ksession1") 
@KReleaseId( groupId = "jar1", rtifactId = "art1", version = "1.1")
private KieSession ksessionv11;

注入相應版本的KieBase和KieSession。

發佈了31 篇原創文章 · 獲贊 22 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章